获取并设置JavaSwing中的JScrollBar位置
我有一个获取并设置JavaSwing中的JScrollBar位置,java,swing,jtable,jscrollpane,jscrollbar,Java,Swing,Jtable,Jscrollpane,Jscrollbar,我有一个JTable,它是从数据库检索到的大量数据的视图 因此,我认为只显示这些数据的一部分(例如前100行),当用户使用JScrollBar到达JTable的末尾时,JTable将显示其他行 因此,我正在寻找一种机制,它可以让我知道滚动条何时位于JTable的末尾,并且只在此时执行另一个查询。当我得到新的列表时,将滚动条的位置设置为新查询之前的位置,只是为了给用户一个“连续性” 有人能给我一些建议来完成这项任务吗 感谢您的支持正如您之前所看到的,大多数JComponents都有模型s,并且它们
JTable
,它是从数据库检索到的大量数据的视图
因此,我认为只显示这些数据的一部分(例如前100行),当用户使用JScrollBar
到达JTable的末尾时,JTable
将显示其他行
因此,我正在寻找一种机制,它可以让我知道滚动条何时位于JTable的末尾,并且只在此时执行另一个查询。当我得到新的列表时,将滚动条的位置设置为新查询之前的位置,只是为了给用户一个“连续性”
有人能给我一些建议来完成这项任务吗
感谢您的支持正如您之前所看到的,大多数JComponents都有模型
s,并且它们是根据其模型呈现的。因此,如果您可以访问模型
,就可以访问您需要的事件和数据
根据这一点,JScrollBar
也遵循这一规则,并有自己的模型。通过获取此模型(它是一个BoundedRangeModel
)并添加一个ChangeListener
,您可以创建从数据库检索下一页数据所需的内容
重要的一点是找到支配JScrollBar
模型的规则BoundedRangeModel
有一些属性可供参考。在这种情况下,其中一些对您很重要的是:
值正在调整
值
范围
最大值
<代码> ValueIsActudio是指我们在改变< BoundedRangeModel > <代码>范围内的过程中。坦率地说,它的意思是:
滚动条
被拖动了吗
其他属性值
、范围
和最大值
可用于确定滚动条
是否达到范围的末尾。如果滚动条到达此处,则是从数据库检索下一页数据的时间。为了说明这种情况,必须应用以下等式:
值
+范围
=最大值
以下代码片段可能会澄清上述解释:
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);
}
}
祝你好运。滚动条有一个模型——我建议你研究一下,了解一下可以附加到滚动条上的侦听器。。。我敢打赌,如果你这样做,你可以自己解决这个问题。“我有一个JTable,它是从数据库检索到的大量数据的视图。”这里我们谈论的是多少条记录?我用Unicode代码点(大约110万)制作了一些表,这些表很好。我不知道我们讨论了多少项,因为这些记录在数据库中存储了30天。我只知道这样的查询会使我的应用程序变慢……谢谢你@statefi的回答。我想再问你一个问题。在阅读您的答案之前,我采用了以下方法:myScroll.getVerticalScrollBar().addAdjustmentListener(新的AdjustmentListener(){//这里是垂直滚动条是否达到最大值的控件}.这是正确的方法还是你的解决方案比这更好?非常感谢again@user2896152:很抱歉,因为我生病了,所以回答迟了。我可以看出,使用与垂直JScrollBar
关联的AdjustmentListener
是正确的,但输入事件只有两个相关属性:ValUE正在调整
和值
,并且它没有范围
和最大值
。因此,无论哪种方式,您都必须获得JScrollBar的模型
的参考。请检查我更新的答案。
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();
}
}
}
});