java - JScrollPane 达到滚动限制事件

标签 java swing jtable jscrollpane

我有一个 JTable 包装在 JScrollPane 中。当我滚动到顶部或底部并继续滚动时,我希望能够检测到这一点,以便可能在开始或结束时加载更多项目,因为一次加载所有项目太昂贵/不切实际。当 JScrollPane 不移动时(例如,当它已经位于顶部或底部时),不会触发 AdjustmentListener:

scrollPane.getVerticalScrollBar().addAdjustmentListener(adjustmentEvent ->
{
    int value = adjustmentEvent.getValue();
    System.out.println(value); // Prints 0 e.g. when the top has been reached
});

但是,即使已经到达结束/开始,我也需要知道用户何时滚动。

如何做到这一点?

最佳答案

我建议在滚动 Pane 的 JViewport 上使用更改监听器。以下示例显示了如何继续。请注意,shouldCheck 可能用于防止错误通知(在我的示例中,顶部在启动时打印三次。如果您运行示例并将 slider 移动到顶部和底部,则会打印相应的文本。

Screenshot with running sample

package com.thomaskuenneth;

import javax.swing.*;

public class Main {

    static boolean shouldCheck = true;

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            JFrame f = new JFrame("Demo");
            f.getContentPane().add(createUI());
            f.pack();
            f.setLocationRelativeTo(null);
            f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
            f.setVisible(true);
        });
    }

    static JComponent createUI() {
        String[][] rowData = new String[200][10];
        String[] columnNames = new String[10];
        for (int i = 0; i < 200; i++) {
            for (int j = 0; j < 10; j++) {
                if (i == 0) {
                    columnNames[j] = String.format("#%d", j);
                }
                rowData[i][j] = String.format("%d - %d", i, j);
            }
        }
        JTable t = new JTable(rowData, columnNames);
        JScrollPane sp = new JScrollPane(t);
        JScrollBar sb = sp.getVerticalScrollBar();
        JViewport vp = sp.getViewport();
        vp.addChangeListener((l) -> {
            if (!shouldCheck) {
                return;
            }
            if (sb.getValue() == sb.getMinimum()) {
                System.out.println("top");
            } else if (sb.getValue() + sb.getVisibleAmount() == sb.getMaximum()) {
                System.out.println("bottom");
            }
        });
        return sp;
    }
}

关于java - JScrollPane 达到滚动限制事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44131192/

相关文章:

java - 调用 modelToView() 方法会卡住 Java Swing 应用程序

java - JTable 拆分单元格。如何

java - 调试执行冒险

java - 尽管我已经尝试过 SQL 中的代码,但我在 WHERE 子句中遇到错误

java - Intellij 无法解析具有多个 SourceSet 的 Gradle 项目中的符号

java - 带有动态 JPopupMenu 的 JTable

java - JTable当编辑行时,改变ENTER Action ?

java - 流氓黑盒 java 应用程序不响应标准输入重定向

java - JTextPane 在 Mac 中渲染 utf-8 文本错误

用于各种硬件的 Java Swing InputEvent 修饰符