Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
获取并设置JavaSwing中的JScrollBar位置_Java_Swing_Jtable_Jscrollpane_Jscrollbar - Fatal编程技术网

获取并设置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();
                }
            }

        }
    });