![](/img/trans.png)
[英]How do you get the cursor position during a jscrollbar drag in java swing?
[英]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
?
其他属性value
, extent
和maximum
是可以用来确定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
,并使用事件获取value
和ValueIsAdjusting
。 另外,您还必须从JScrollBar
的model
获取extent
和maximum
。 以下代码段显示了另一种方法:
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.