同步两个滚动条JavaFX

2023-12-06

我的问题是我有两个水平滚动条,我希望它们一致滚动,我尝试使用:

bar1.valueProperty().bindBidirectional(bar2.valueProperty());

问题是我注意到bar1的最大值是1.0 while bar2的最大值是102.5。因此,当我滚动时出现问题bar2, bar1由于其价值差异较大,其变动幅度较大。我尝试过使用setMin, setMax, setUnitIncrement, setBlockIncrement在绑定 value 属性之前。但这是行不通的。

public class DynamicTableView extends Application {
    private Scene scene;
    private VBox root;
    private ScrollPane scPane;
    private static final int N_COLS = 10;
    private static final int N_ROWS = 10;
    private Button button;

    public void start(Stage stage) throws Exception {

        root = new VBox();
        scPane = new ScrollPane();
        Label lbl = new Label("Dynamic Table Dynamic Table Dynamic Table Dynamic Table Dynamic Table Dynamic Table Dynamic Table Dynamic Table Dynamic Table Dynamic Table Dynamic Table Dynamic Table Dynamic Table Dynamic Table Dynamic Table Dynamic Table Dynamic Table");
        scPane.setContent(lbl);

        root.getChildren().add(scPane);

        TestDataGenerator dataGenerator = new TestDataGenerator();

        TableView<ObservableList<String>> tableView = new TableView<>();

        // add columns
        List<String> columnNames = dataGenerator.getNext(N_COLS);
        for (int i = 0; i < columnNames.size(); i++) {
            final int finalIdx = i;
            TableColumn<ObservableList<String>, String> column = new TableColumn<>(
                    columnNames.get(i)
            );
            column.setCellValueFactory(param -> new ReadOnlyObjectWrapper<>(param.getValue().get(finalIdx)));
            tableView.getColumns().add(column);
        }

        // add data
        for (int i = 0; i < N_ROWS; i++) {
            tableView.getItems().add(
                    FXCollections.observableArrayList(
                            dataGenerator.getNext(N_COLS)
                    )
            );
        }

        root.getChildren().add(tableView);

        tableView.setPrefHeight(200);

        button = new Button("Delete");
        button.setOnAction(event -> { tableView.getItems().clear();});

        root.getChildren().add(button);

        Scene scene = new Scene(root, 600, 600);
        stage.setScene(scene);
        stage.show();

        for(Node node1: scPane.lookupAll(".scroll-bar"))
        {
            if(node1 instanceof ScrollBar)
            {
                ScrollBar scrollBar1 = (ScrollBar)node1;
                if(scrollBar1.getOrientation() == Orientation.HORIZONTAL)
                {
                    for(Node node2: tableView.lookupAll(".scroll-bar"))
                    {
                        if(node2 instanceof ScrollBar)
                        {
                            ScrollBar scrollBar2 = (ScrollBar)node2;
                            if(scrollBar2.getOrientation() == Orientation.HORIZONTAL)
                            {
                                scrollBar2.valueProperty().bindBidirectional(scrollBar1.valueProperty());
                                break;
                            }
                        }
                    }
                }
            }
        }

    }

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

    private static class TestDataGenerator {
        private static final String[] LOREM = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc tempus cursus diam ac blandit. Ut ultrices lacus et mattis laoreet. Morbi vehicula tincidunt eros lobortis varius. Nam quis tortor commodo, vehicula ante vitae, sagittis enim. Vivamus mollis placerat leo non pellentesque. Nam blandit, odio quis facilisis posuere, mauris elit tincidunt ante, ut eleifend augue neque dictum diam. Curabitur sed lacus eget dolor laoreet cursus ut cursus elit. Phasellus quis interdum lorem, eget efficitur enim. Curabitur commodo, est ut scelerisque aliquet, urna velit tincidunt massa, tristique varius mi neque et velit. In condimentum quis nisi et ultricies. Nunc posuere felis a velit dictum suscipit ac non nisl. Pellentesque eleifend, purus vel consequat facilisis, sapien lacus rutrum eros, quis finibus lacus magna eget est. Nullam eros nisl, sodales et luctus at, lobortis at sem.".split(" ");

        private int curWord = 0;

        List<String> getNext(int nWords) {
            List<String> words = new ArrayList<>();

            for (int i = 0; i < nWords; i++) {
                if (curWord == Integer.MAX_VALUE) {
                    curWord = 0;
                }

                words.add(LOREM[curWord % LOREM.length]);
                curWord++;
            }

            return words;
        }
    }
}

将scrollPane 中的scrollBar 的valueProperty 与tableView 中的scrollBar 的valueProperty 进行双向绑定是不可能的,因为前者已标准化,而后者则未标准化。相反,监听更改并手动缩放,例如:

protected void bindScrollBarValues(ScrollBar scrollBarInTable, ScrollBar scrollBarInPane) {
    // can't use bidi-binding because bar in scrollPane is normalized, bar in table is not
    // scrollBarInTable.valueProperty().bindBidirectional(scrollBarInPane.valueProperty());
    // scale manually
    scrollBarInTable.valueProperty().addListener((src, ov, nv) -> {
        double tableMax = scrollBarInTable.getMax();
        scrollBarInPane.setValue(nv.doubleValue() / tableMax);
    });

    scrollBarInPane.valueProperty().addListener((src, ov, nv) -> {
        double tableMax = scrollBarInTable.getMax();
        scrollBarInTable.setValue(nv.doubleValue() * tableMax);
    });
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

同步两个滚动条JavaFX 的相关文章

  • 我们可以像 swing JSplitPane 一样在 Javafx SplitPane 上添加 OneTouchExpansable 按钮吗

    我可以在 JavaFX 上使用 css java api 库添加 OneTouchExpandable 按钮吗SplitPane Swing 中已经存在此选项JSplitPane 但我在 JavaFX API 上找不到该选项 我想 我们可以
  • 修复了 div 背景重叠浏览器滚动条的问题

    我以前从未见过的非常奇怪的行为 我有一个固定位置的 div 它有一个透明的 png 背景图像 z index 设置为 1 以便内容可以使用滚动条在固定图像上滚动 我将其放置在底部和右侧 0px 处 但图像与滚动条重叠 无论如何 在 FF 和
  • 如何获取JavaFX的版本号?

    如何在运行时找出我正在使用哪个版本的 JavaFX 简单的方法之一就是简单地阅读javafx properties文件位于您的 JAVA HOME jre lib目录 我现在安装了 Java 1 7 u9 与之捆绑的 JavaFX 是 v2
  • 带有地图的 JavaFX TableView 对象

    因此 我对 JavaFx TableView 进行了一些挖掘 并找到了一些针对简单情况的不错的解决方案 This article http docs oracle com javafx 2 ui controls table view ht
  • JavaFX - setVisible 隐藏元素但不重新排列相邻节点

    在 JavaFX 中 如果我有一个场景有 2VBox元素和每个VBox有多个Label in it 如果我设置顶部VBox to 无形的 为什么底部VBox 不向上移动顶部的场景VBox was The VBox is 无形的但我希望其他物
  • 在JavaFX中如何在表视图中添加带有数据的组合框

    我已经尝试了很多 但无法将数据库中的所有值填充到我的组合框表格单元格中 控制器 java public class controller GetConnection gc new GetConnection PreparedStatemen
  • 如何在MUI GridList中实现图块的水平滚动?

    这是我的 JS 页面 我需要在其中实现GridList组件显示多个图块 并且在列表大小超出屏幕限制后可水平滚动 import React useState from react import Header from common heade
  • 更改 tkinter 中滚动条的外观(使用 ttk 样式)

    我想知道你是否可以帮我解决 ttk 中的样式选项问题 我已经设法将大部分基本 ttk 小部件更改为我喜欢的样式 我只是坚持改变滚动条的样式 我已经搜索了几个小时来寻找答案 不幸的是没有结果 这是使用滚动条样式选项的示例代码 import t
  • 仅当用户开始输入时清除 JavaFX TextField 中的提示文本

    默认行为是当字段获得焦点时 字段中的提示文本将被删除 那是标记在场上的时候 是否可以配置文本字段 以便仅在用户开始输入时删除提示文本 否则 我需要在每个文本字段旁边 上方添加一个标签 以描述其中的值 我知道它有点旧 但我自己也需要它 这仍然
  • JavaFX 模块对于 VM 不可见

    我使用 Intellij Idea 作为我的 IDE 由于我需要使用 css 文件 因此我安装了 Intellij Ultimate 现在 javaFx 不适用于它们 抛出异常 boot层初始化时出错 java lang module Fi
  • Windows Phone 7 - ScrollViewer 值已更改

    我一直在寻找解决方案 但无法找到正确的解决方案 我的网格宽度为 960 并且有ScrollViewer在里面 现在我想知道滚动时滚动的值 水平偏移 我找到的所有解决方案都是针对 wpf silverlight 的 它对我不起作用 Edit
  • ObservableList 不更新 ArrayList

    对于学校作业 我们正在使用 JavaFX 中的 ObservableList 对象 对吗 我已经为此工作了一天多了 但无法弄清楚 老师只告诉我们 谷歌一下 所以这也没有帮助 基本上 我们正在开发一个基本的管理应用程序来跟踪人们及其家人 人们
  • JavaFX 应用程序隐藏 OSX 停靠图标

    我需要隐藏 javafx 应用程序的停靠图标 在普通的 java 应用程序中 这可以通过以下属性来实现 System setProperty apple awt UIElement true 然而 这似乎不适用于 JavaFX Thanks
  • JavaFX TabPane 禁用按键切换选项卡

    我有一个Tab有一些内容 ScrollBar和别的 The ScrollBar has event handler for keys left and right 但如果我按下这些按钮Tabs被切换 因为TabPane还有一个密钥处理程序
  • 使 Java JScrollpane 仅垂直滚动

    我希望我的整个 JFrame 能够垂直滚动 我添加了以下代码 但它只创建了一个水平滚动条 frame setContentPane new JScrollPane new GradeQuickResource 我想做相反的事情 我只想要一个
  • 无法启动使用 Apache POI 的 JavaFX 应用程序

    我有一个按预期工作的 JavaFX 应用程序 我需要使用 Apache POI 来读取和写入 excel 文件 以下是我已采取的步骤 添加了所需的依赖 implementation org apache poi poi ooxml 5 2
  • 如何在 JavaFX 中对单选按钮的最大可选复选框进行限制?

    请看下面的图片 您就会了解我的应用程序的布局 我希望能够动态选择多少CheckBox 启用下拉菜单 是可选的 固定数量 我想用这 3 个人来实现这个目标RadioButton 在垂直模式下全部 4CheckBox必须选择 不少于 在混合模式
  • JavaFX 按钮不会禁用

    我有一个可能需要几秒钟到几分钟的任务 当我单击按钮执行该任务时 它会运行该任务但并不总是禁用按钮A和启用按钮B 这是我正在使用的代码 FXML public void onExecute ActionEvent event btnExecu
  • Mac OS X 下的 JavaFX:系统菜单和模态窗口

    我目前面临 Mac OS X 下的 JavaFX 菜单和模式对话框的问题 我正在使用该方法 MenuBar setUseSystemMenuBar true 为了将系统菜单栏用于我的应用程序菜单 这工作正常 但如果模式对话框打开 菜单不会被
  • Javafx 拖放 TabPane

    我 在 JavaFx 应用程序中 有一个带有不同选项卡的选项卡 我想实现拖放功能以将选项卡拖到舞台之外 这样它就可以生成一个新窗口 就像在 Google Chrome 中一样 谢谢您的帮助 您应该检查 Tom Schindl 在他的网站上显

随机推荐

  • 在 malloc 内存上使用 sizeof() [重复]

    这个问题在这里已经有答案了 可能的重复 新手关于malloc和sizeof的问题 我正在尝试将字符串读入程序中 当我注意到字符串有时会被损坏时 我尝试了以下代码 void mallocated malloc 100 printf sizeo
  • 如何将拒绝的行重定向到另一个文件?

    这是我的来源csv file col1 col2 col3 col4 col5 col6 1 A AA X Y H 2 B CC D reject this row because CC it should be in col3 3 E F
  • Laravel 从 base64 返回图像预览

    我有 Base64 图像 我想返回图像预览而不是 Base64 代码 I tried return response base64 decode results gt getBase64Image 200 Content Type gt i
  • Bokeh 跳过分类数据的刻度标签

    我使用的是 Bokeh 版本 0 12 13 我有混合的数字和分类数据 我在 x 轴上只有一个分类数据 其余的都是数字 我将所有内容转换为分类数据来进行绘图 可能不是实现我的目标的最简单方法 现在我的 x 轴刻度标签比我需要的要密集得多 我
  • 如何在mysql中将单行拆分为多列

    简单问一下 mysql中有没有可用的函数将单行元素拆分为多列 我有一个带有字段的表行 user id user name user location 在此用户可以添加多个位置 我使用 php 将位置内爆并将其作为单行存储在表中 当我在网格视
  • Cosmos Mongo API“In”数组表达式问题

    IN 表达式有问题吗 我们遇到的问题是 即使存在 它也找不到我们要求的结果 SerialNumber V8073023 t DeviceEventDataEvent EventType NumberInt 4 isDeleted in fa
  • C++ vector > 在开始处保留大小

    在 C 中我有 vector
  • 检测未初始化的数组

    在下面的程序中 两个例程set int array and set real array为虚拟数组定义一些值 但假设初始化a and r 第 1 行和第 2 行 无意中丢失了 即 这两行在正确的程序中都应该取消注释 我的问题是如何使用某些编
  • Symfony2在全局文件夹下命令行生成树枝模板

    我正在使用 Symfony2 8 每当我使用命令行生成控制器 and 树枝模板模板是在下面创建的 MyBundle Resources views home home html twig 我想遵循以下建议的最佳实践symfony 文档并将其
  • 响应式箭头面包屑导航[重复]

    这个问题在这里已经有答案了 所以我有一个面包屑导航 箭头间隔开 棘手的是我需要它具有响应能力 我想我在使用 vh 和 vw 时已经很混乱了 但我遇到的问题是白色间隔符没有像前面的箭头那样响应 有什么建议么 或者有更好的方法来处理吗 我尝试了
  • Jexcel公式计算错误

    我创建了一个工作表 out xls其中单元格 D6 D5 2 且 D5 设置为 1 我的问题是 当我将值插入 jxl 中的 D5 时 D6 永远不会计算 当我在 Excel 中将 1 插入到 D5 中时 D6 只是保留它最初计算出的值 注意
  • python:转换损坏的xls文件

    我从 SAP 应用程序下载了一些销售数据集 SAP 已自动将数据转换为 XLS 文件 每当我打开它时使用Pandas库我收到以下错误 XLRDError Unsupported format or corrupt file Expected
  • 临时文件目录“/var/www/html/activate/../temp/”在实时服务器上不可写

    我在生成 PDF 文件时在实时服务器上收到此错误 它在我的本地系统上运行良好 我正在使用 Laravel 和这个 mPdf 包来生成 PDF PDF包 我如何向该 Temp 文件夹授予可写权限 我在代码中找不到它 并且在服务器上它也不位于上
  • Apache 2.4 中所有大写的 HTTP 标头都去掉了下划线

    我有一个应用程序依赖于发送全部大写加下划线的 HTTP 标头以及请求 从 开始阿帕奇2 4 包含无效字符 包括下划线 的标题现在 默默地落下 这一页建议您可以更改一些设置 以允许不删除旧的 HTTP 标头 即 如果它们在 CURL 中设置
  • 在光标位置插入笑脸

    我正在制作一个项目 用户可以单击表情符号并将它们插入到 contenteditable div 中 我想要三个 div 无论我在什么 div 中 笑脸都应该插入该 div 中 另外 这里的问题是表情符号只插入在 div 的末尾 我希望笑脸只
  • Javascript:如何获取输入文本区域的最后两个字符?

    获取文本区域框中输入的最后两个字符的最佳方法是什么 我需要输入最后 2 个字符 而不是整个字符串的最后两个字符 感谢您的帮助 你需要抓住keypress文本区域上的事件 然后保留按下的按键的日志 请注意 这将捕获箭头键 Shift Alt
  • 比较/过滤两个数组,其中数组 B 包含 A 的任何子字符串

    好的 这是我部分工作的内容 忽略区分大小写 比较以下内容 arrayA apples Oranges salt Cracked Black Pepper arrayB salt pepper orange 它 部分 与以下内容一起工作 fi
  • iPhone 相机视图上的实时水印图像

    提前特别感谢 我是iphone软件开发的初学者 只是寻找如何使用可可以编程方式将水印图像实时添加到相机视图中 不是一步一步地寻找 虽然那会很棒 而是或多或少地寻找我应该从哪里开始学习如何 是否有为此开发的框架 想要一些使用 XCode 框架
  • 将行添加到可编辑网格视图后,日期选择器不出现

    我有一个可编辑的 Gridview 其列如下
  • 同步两个滚动条JavaFX

    我的问题是我有两个水平滚动条 我希望它们一致滚动 我尝试使用 bar1 valueProperty bindBidirectional bar2 valueProperty 问题是我注意到bar1的最大值是1 0 while bar2的最大