gpt4 book ai didi

java - JScrollPane 达到滚动限制事件

转载 作者:行者123 更新时间:2023-12-01 20:24:28 25 4
gpt4 key购买 nike

我有一个 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com