如何使ListView的宽度适合其单元格的宽度

2024-04-23

我有一个带有自定义单元工厂的 ListView。我计算单元格的最大值 minWidth 并将其设置为整个 ListView 的 minWidth。因此,受布局中其他区域约束的 ListView 会精确地缩小到 minWidth。但它所容纳的单元格的大小会调整为首选宽度,而不是最小宽度。因此,节点不适合包含视口,并且会显示水平滚动条。

太恶心了。我想让每个单元格完全适合 ListView,并摆脱滚动条。更确切。当 ListView 减小到其最小宽度时,其所有单元格也应减小到该最小宽度。

我正在寻找一些控制属性来切换单元格大小调整策略,以便在没有预定义开关的情况下实现所描述的行为。


更新:添加了图形示例

我创建了 SplitPane 来简化测试布局。我可以通过用鼠标移动其分隔符来定义布局限制。

第一张照片显示了最初的问题:不考虑单元节点的实际尺寸(最小、最大、首选)。 ListView 始终使用 prefWidth,即使它大于视口宽度。因此,当可以避免水平滚动时,就使用水平滚动。

之后我尝试手动将首选宽度设置得更小。所以单元格现在完全可见。这不是解决方案。我给出这个镜头是为了证明单元格的 minWidth 足够小以适合 ListView。

最后一张也太丑了它留下了可以填充单元格内容的自由空间。这是很自然的:如果视口大于首选宽度并小于最大宽度,则应将其用于调整单元格内容的大小。

通过切换到显式指定的元素的静态大小可以抑制该问题。但这样做意味着放弃动态布局的所有好处:每次使用 CSS 应用新皮肤时,程序员都必须更改大小常量,并且用户将被禁止使用鼠标调整窗口大小或移动分隔符。

这也是一个糟糕的解决方案。我需要什么 - 使 javafx 的布局引擎工作。 ListView 的最小宽度应该是其单元格的最大最小宽度。 ListView 的最大宽度应为其单元格的最小最大宽度。 ListView 的首选宽度应该是其单元格的最大首选宽度。 ListView 的实际宽度应由其父级(本例中的 SplitPane)相对于所有三个布局边界进行设置。之后这个大小应该传递给单元格。

仅当某些单元格最小宽度太大而无法适应视口时,才应显示水平滚动条。


只需绑定单元格即可prefWidthProperty到ListView的widthProperty。我减去了一些边框等。

使用字符串,您将得到省略号...而不是滚动条。

import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.ListCell;
import javafx.scene.control.ListView;
import javafx.scene.control.SplitPane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import javafx.util.Callback;

public class CellSize extends Application {

    @Override
    public void start(Stage stage) {
        ObservableList<String> items = FXCollections.observableArrayList(
                "hello world", "This is a test", "this is not a drill","vroom...this IS a drill");

        ListView<String> lv = new ListView(items);
        final VBox leftBox  = new VBox(lv,new Button("Unused"));

        lv.setCellFactory(new Callback<ListView<String>, ListCell<String>>() {

            @Override
            public ListCell<String> call(ListView<String> param) {
                ListCell lc = new ListCell<String>() {

                    @Override
                    protected void updateItem(String item, boolean empty) {
                        super.updateItem(item, empty);
                        if (empty) {
                            setText(null);
                            setGraphic(null);
                        } else {
                            setGraphic(null);
                            if (item == null) setText("null");
                            else {
                                setText(item);
                                double minWidth = 5 * item.length();
                                double maxWidth = 10 * item.length();
                                leftBox.setMinWidth(Math.max(minWidth, leftBox.getMinWidth()));
                                leftBox.setMaxWidth(maxWidth);
                            }
                        }
                    }
                };
                lc.prefWidthProperty().bind(lv.widthProperty().subtract(4));
                return lc;
            }
        });

        SplitPane root = new SplitPane();
        root.getItems().addAll(leftBox,new VBox(new Label("Hello")));
        Scene scene = new Scene(root, 300, 250);

        stage.setScene(scene);
        stage.show();

    }

    public static void main(String[] args) {
        launch(args);
    }

}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使ListView的宽度适合其单元格的宽度 的相关文章

  • 具有多个 Item 布局的 ListView 适配器

    我正在考虑向我的 Android 应用程序添加一个带有缩略图的列表视图 左边是缩略图 右边是文字 有没有办法用单独的 xml 文件填充列表视图 例如 我可以为奥地利 英国 美国等提供单独的 xml 并将它们添加到列表视图中吗 我问的原因是
  • 从 javaFX 场景拖放到 Windows 资源管理器

    有什么方法可以从 javaFX 场景拖放到 Windows 资源管理器吗 就在这里 您应该使用 onDragDetected 函数来启动拖放事件 并使用 onDragDone 函数在完成拖放后执行您想要的任何操作 这里有一个例子 final
  • 自定义列表视图的选择器“更改 ListView 背景 - 奇怪的行为”

    我正在用这个教程 http www androidpeople com android custom listview tutorial example part 2 我想为此列表视图添加选择器 我尝试了一些代码 但它不起作用 我该怎么做
  • 有没有办法在坐标平面上动态绘制点之间的线?

    我正在完成一个项目 在该项目中我实现了一个暴力算法来解决凸包问题 我还需要为该算法创建视觉效果 我试图在 x 轴和 y 轴上创建一个范围从 100 100 的坐标平面 绘制完整集中的所有点 并在点之间动态绘制线条以创建凸包 例如 假设我有
  • JavaFX Node.lookup() 仅对使用 FXMLLoader 加载的 Parent 中的某些元素返回 null

    我从 FXML 加载了一个父级 将其添加到场景 舞台内的窗格中并显示它 然后立即查找组件 Lookup 对某些返回 null 但对其他返回非 null 什么情况下会这么做 这是加载和查找代码 rootUi FXMLLoader load g
  • JavaFX 的 Swing 计时器替代方案以及线程管理差异

    使用 JavaFX 的 Swing 计时器是否安全 或者 Swing 有特殊的替代方案吗 JavaFX 和 Swing 的线程管理有什么区别 事实上我很想知道相当于摇摆计时器 SwingUtilities invokeLater and i
  • 根据内容对列表视图中的相似行进行分组

    i have a listview that displays a set of rows each row is clickable now i wish to group similar type of rows under one h
  • 尝试使 Tableview 可点击时发生 JavaFX 错误

    我正在尝试使表格视图可单击 它将返回单击的单元格中的文本 尝试在 Netbeans 中编译时收到两个错误 所有代码均取自 示例12 11 单元格编辑的替代解决方案 官方表格视图教程 http docs oracle com javafx 2
  • 学习 Java Native Access 时出现 com.sun.glass.ui 包错误

    我正在尝试在 JavaFX 项目中使用 Undecorated 阶段 stage initStyle StageStyle UNDECORATED 它是一个模块化的 Gradle 项目 它也是一个多项目构建 https guides gra
  • Android相对布局放置问题

    我在 XML 中为列表项创建相对布局以用于 ListView 中的一系列项目时遇到问题 我已经尝试了几个小时 并且正在撕扯我的头发 试图让它看起来像我想要的那样 但无法让所有东西都出现在正确的位置 而不是重叠或错位 我可以获取第一张图像和接
  • Android 并获取 id 转换为字符串的视图

    在 Android 项目的 Java 代码中 如果您想要视图资源的引用 您可以执行以下操作 View addButton findViewById R id button 0 在上面的 R id button 0 不是一个字符串 是否可以通
  • 如何防止 HTML 文本孤儿?

    我经常在图像周围包裹文字 有时文字包裹起来很笨拙 如下所示 在 HTML 中 图像向左浮动 文本如下 p img src images image p p This is my David Copperfield em I was born
  • JavaFX - 如何检测 Windows 注销/关闭请求?

    我有一个应用程序必须在退出时处理一些方法 但是 当用户在没有先关闭我的应用程序的情况下关闭 Windows 时 Windows 会终止该应用程序并且不会运行关闭方法 如何检测用户何时请求关闭或注销 Windows 我需要运行的方法需要几毫秒
  • 在Android中,如何在考虑由fling引起的加速的同时实现列表视图的捕捉效果?

    为了演示 我有一个显示数字列表的 ListView 我想实现这样的效果 当用户滚动ListView并且滚动结束时 它只会停在某些位置 以便第一个可见项始终完全显示 我在下面附上了我尝试的代码 当用户拖动滚动 ListView 时它会起作用
  • 以编程方式设置 ListView 中的激活项

    我有一个简单的ListView与一些具有setChoiceMode set to ListView CHOICE MODE SINGLE 这意味着当我触摸某个项目时 它会突出显示 这样用户就可以看到什么菜单选项 ListView是一个菜单
  • Android - ListView 不接收带有可点击链接的文本视图的 OnItemClick

    我有一个 ListView 除了许多其他视图之外 每行还包含一个 TextView TextView 呈现可能包含链接的 html 内容 以下代码出现在列表适配器中 m textview setMovementMethod LinkMove
  • Android TableLayout 宽度

    我有两列TableLayout作为滚动视图的唯一子视图 第一列包含TextViews labels 并且第二列包含EditText Spinner DateWidget等等 价值观 尽管我已指定android layout width fi
  • 如何允许用户对列表中的项目重新排序?

    我有一个 Android 应用程序 用户可以在其中将项目添加到列表中 并且我希望他们能够按照自己的意愿对列表中的项目进行重新排序 而不是仅仅向他们提供不同的排序顺序 为项目添加位置设置 它们来自数据库 很容易 但是用户可以使用哪种 UI 元
  • 使用 CSS3 计算值

    CSS3有没有办法实现这一点 height 100 110px 我的背景 你不能用纯 CSS 来计算它 正如 Litek 提到的 它不适用于所有浏览器 但是有一种组织方法可以处理这个问题 但是您需要将元素包装在另一个浏览器中 body he
  • 如何使用 Java 11 和 JavaFX 11 运行 ControlsFX 示例应用程序

    ControlFX 网站 http fxexperience com controlsfx says 如果您想使用 ControlsFX 示例应用程序 只需 下载 ControlsFX 版本并在上运行以下命令 命令提示符 请务必将 替换为实

随机推荐