gpt4 book ai didi

java - 在 Java Swing 中获取和设置 JScrollBar 位置

转载 作者:行者123 更新时间:2023-12-02 04:18:07 25 4
gpt4 key购买 nike

我有一个 JTable,它是从数据库检索的大量数据的 View 。

出于这个原因,我想只显示这些数据的一部分(例如前 100 行),并且当用户使用 JScrollBar 到达 JTable 的末尾时,JTable 将显示其他行。

因此,我正在寻找一种机制,让我知道滚动条何时位于 JTable 的末尾,并且仅在此时执行另一个查询。并且,当我获得新的 List 时,将滚动条位置设置为新查询之前的位置,只是为了给用户提供“连续性”。

任何人都可以提供一些完成此任务的提示吗?

先谢谢你了

最佳答案

正如您之前所看到的,大多数 JComponent 都有 model,并且它们根据其模型进行渲染。因此,如果您可以访问模型,您就可以访问您所需的事件和数据。

据此,JScrollBar也遵循这个规则,并且有自己的模型。通过获取此模型(BoundedRangeModel)并添加 ChangeListener,您可以创建从数据库检索下一页数据所需的内容。

重要的一点是找到统治 JScrollBar 模型的规则。 BoundedRangeModel 有一些属性可供您引用。在这种情况下,其中一些对您很重要的是:

  • valueIsAdjusting
  • 范围
  • 最大值

ValueIsAdjusting 指示我们是否处于更改 BoundedRangeModel 范围的过程中。坦率地说,这意味着:scrollBar 是否被拖动了?

其他属性 valueextentmaximum 可以用来确定 ScrollBar是否到达范围的末端。如果滚动条到达那里,就是从数据库中检索下一页数据的时候了。为了表明这种情况,必须应用以下等式:

+ 范围 = 最大值

以下代码片段可以澄清上述解释:

import java.awt.BorderLayout;

import javax.swing.BoundedRangeModel;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.table.DefaultTableModel;

public class LiveJTableDemoFrame extends JFrame {
private static final int FRAME_HEIGHT = 200;
private static final int FRAME_WIDTH = 400;
//
private JTable table;
private String[] columnNames;
private DefaultTableModel tableModel;

public LiveJTableDemoFrame() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(FRAME_WIDTH, FRAME_HEIGHT);
//
columnNames = new String[]{"ID", "A", "B", "C", "D"};
//
tableModel = new DefaultTableModel(columnNames, 0);
table = new JTable(tableModel);
//
final JScrollPane p = new JScrollPane();
p.setViewportView(table);
p.getVerticalScrollBar().getModel().addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
BoundedRangeModel scModel = p.getVerticalScrollBar().getModel();
boolean valueIsAdjusting = scModel.getValueIsAdjusting();
if(!valueIsAdjusting){
if(scModel.getValue() + scModel.getExtent() == scModel.getMaximum()){
retrieveData();
}
}
}
});
//
retrieveData();
//
this.setLayout(new BorderLayout());
this.add(p, BorderLayout.CENTER);
}

//Dummy method to simulate retrieving data from database
private void retrieveData(){
for (int i = 0; i < 10; i++){
Object[] rowData = new Object[columnNames.length];
//
rowData[0] = tableModel.getDataVector().size();
rowData[1] = "A";
rowData[2] = "B";
rowData[3] = "C";
rowData[4] = "D";
//
tableModel.addRow(rowData);
}
//tableModel.fireTableDataChanged();
}

public static void main(String[] args) {
new LiveJTableDemoFrame().setVisible(true);
}
}

[更新]

另一种方法是向垂直 JScrollBar 添加一个 AdjustmentListener 并使用该事件获取 value值正在调整。此外,您还必须从 JScrollBarmodel 获取 extentmaximum。以下代码片段显示了另一种方法:

    final JScrollPane p = new JScrollPane();
p.setViewportView(table);
p.getVerticalScrollBar().addAdjustmentListener(new AdjustmentListener(){
@Override
public void adjustmentValueChanged(AdjustmentEvent e) {
// here the control if vertical scroll bar has reached the maximum value
if(!e.getValueIsAdjusting()){
JScrollBar source = (JScrollBar) e.getAdjustable();
int extent = source.getModel().getExtent();
int maximum = source.getModel().getMaximum();
if(e.getValue() + extent == maximum){
retrieveData();
}
}

}
});

祝你好运。

关于java - 在 Java Swing 中获取和设置 JScrollBar 位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33081805/

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