首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Javafx:如何将单元格宽度限制为ListView的宽度

Javafx:如何将单元格宽度限制为ListView的宽度
EN

Stack Overflow用户
提问于 2016-05-10 05:44:06
回答 2查看 6.4K关注 0票数 5

一直在为这件事而挣扎。

我希望列表单元格仅限于父ListView的宽度,如果文本被剪裁/溢出,包含的文本将显示省略点。

但不管我做什么,所有细胞的宽度都会增长到这些细胞中最长的文本的长度。溢出单元格中的文本是“剪裁”,而不是我想要的,即省略点。

我的ListView是用fxml定义的:

代码语言:javascript
运行
复制
<BorderPane fx:id="listViewResultsParentPane">
    <center>
        <ListView fx:id="listViewResults"/>
    </center>
</BorderPane>

我有一个列表单元格类:

代码语言:javascript
运行
复制
public class ResultsListCell extends ListCell<ResultsListItem> {
    @Override
    public void updateItem(final ResultsListItem item, final boolean empty) {
        super.updateItem(item, empty);
        if(empty || item == null){
            setText("");
        } else {
            setText(item.title);
            setTextOverrun(OverrunStyle.ELLIPSIS);
            setEllipsisString("...");
        }
    }
}

为了摆脱水平滚动条,我使用这个css:

代码语言:javascript
运行
复制
.list-view#listViewResults .scroll-bar:horizontal .increment-arrow,
.list-view#listViewResults .scroll-bar:horizontal .decrement-arrow,
.list-view#listViewResults .scroll-bar:horizontal .increment-button,
.list-view#listViewResults .scroll-bar:horizontal .decrement-button {
    -fx-padding:0;
}

要设置/限制我尝试过的单元格的宽度:

  • 在updateCell调用中,将每个单元格的宽度设置为父单元格的宽度。
  • 将每个单元格的prefHeight和maxHeight属性绑定到父单元格的属性
  • 将单元格css属性的maxHeight和prefHeight设置为100%

任何帮助都将不胜感激。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-05-10 07:25:50

溶液

将每个单元格的宽度绑定到列表的首选宽度,减去两个像素以允许列表边框。并将每个单元格的最大宽度设置为其首选大小:

代码语言:javascript
运行
复制
prefWidthProperty().bind(list.widthProperty().subtract(2));
setMaxWidth(Control.USE_PREF_SIZE);

您不需要任何自定义CSS来删除水平滚动条。只有当显示的列表单元格超过ListView的宽度时,水平滚动条才会显示,并且上面指定的约束确保永远不会发生这种情况。您也不需要设置单元格的文本溢出样式和省略字符串,因为默认情况下,这些字符串将被设置为您想要的值。

完整示例程序

代码语言:javascript
运行
复制
import javafx.application.Application;
import javafx.collections.*;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.stage.Stage;

public class ElidedListView extends Application {
    @Override
    public void start(Stage stage) {
        ListView<String> list = new ListView<>();
        ObservableList<String> items = FXCollections.observableArrayList(
                "Lorem ipsum dolor sit amet, consectetur adipiscing elit.",
                "Aenean nibh ipsum, semper nec ipsum quis, dignissim gravida arcu.",
                "Sed posuere auctor magna vel suscipit.",
                "Aenean eu diam at dolor auctor porta.",
                "Integer tincidunt ex metus, in euismod velit facilisis in.",
                "Praesent purus mi, mattis rutrum egestas vitae, elementum vel dolo"
        );
        list.setItems(items);
        list.setCellFactory(param -> new ListCell<String>() {
            {
                prefWidthProperty().bind(list.widthProperty().subtract(2));
                setMaxWidth(Control.USE_PREF_SIZE);
            }
            @Override
            protected void updateItem(String item, boolean empty) {
                super.updateItem(item, empty);

                if (item != null && !empty) {
                    setText(item);
                } else {
                    setText(null);
                }
            }
        });

        stage.setScene(new Scene(list));
        stage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}
票数 11
EN

Stack Overflow用户

发布于 2018-01-25 15:47:42

一种更简单和更好的解决方案是将列表单元格的首选宽度设置为0。无论如何,列表单元格将调整为查看列表的宽度,但是它不会比可用空间更宽。这实际上隐藏了水平滚动条,使用/不使用垂直滚动条正确地响应,并且不需要任何绑定。(唯一例外的是计算出的最小宽度高于列表视图宽度的列表单元格)

代码语言:javascript
运行
复制
list.setCellFactory(l -> new ListCell<String>() {
    { // constructor
        setPrefWidth(0); // avoids the issues
    }

    @Override
    protected void updateItem(String item, boolean empty) {
        super.updateItem(item, empty);
        // do whatever you like
    }
});
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37130122

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档