繁体   English   中英

获取并设置Java Swing中的JScrollBar位置

[英]Get and set JScrollBar position in Java Swing

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

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

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

有人可以提供一些提示来完成此任务吗?

谢谢你

如您所见,大多数JComponents都具有model并且根据其模型进行渲染。 因此,如果可以访问model ,则可以访问用于目标的事件和数据。

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

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

  • valueIsAdjusting
  • value
  • extent
  • maximum

ValueIsAdjusting是一个指示我们是否正在更改BoundedRangeModel范围的过程中的过程。 坦率地说,这意味着:是否拖动了scrollBar

其他属性valueextentmaximum是可以用来确定ScrollBar是否达到范围末端的ScrollBar 如果Scrollbar到达该位置,则该是从数据库检索下一页数据的时候了。 为了表明这种情况,必须使用以下公式:

value + extent = maximum

以下代码段可以澄清以上说明:

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 ,并使用事件获取valueValueIsAdjusting 另外,您还必须从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();
                }
            }

        }
    });

祝好运。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM