gpt4 book ai didi

java - 使用 JTable 和 JScroll Pane 进行滚动锁定

转载 作者:行者123 更新时间:2023-11-30 04:59:30 24 4
gpt4 key购买 nike

我有一个使用 EventTableModel 创建的 JTable并且位于 JScrollPane 中。 EventTableModel 从事件列表中获取实时更新并将结果显示在表中。当新结果进入表格时,新的信息将显示在表格顶部。

但是,我想要做的是卡住表格以显示当我按下名为“锁定表格”的按钮时当前显示的内容。此按钮应与 Eclipse 控制台“Scroll Lock”具有相同的效果,因此当新项目出现时,当前项目应保留在屏幕上,并且不会在新项目出现时被推开。但仍应添加新项目,只是不会自动滚动到。

有谁知道我如何尝试实现此功能。这样,当更新到来时,表上的数据不会被迫离开屏幕,因此当按下复选框时,焦点仍保留在当前数据上。

感谢您的帮助。迈克尔

最佳答案

基本过程(用于插入当前显示区域上方)

  • 在表模型上安装 TableModelListener
  • 启用锁定时:记下当前可见矩形下方的行数
  • 在锁定时接收插入时,滚动以使下面的行数保持不变

一些工作代码(使用 JXTable,因为它有方便的滚动方法,对于核心表,只需自己进行计算:-)

public static class ScrollLock {
private JXTable table;
private boolean blocked;
private int rowsBelow;

public ScrollLock(JXTable table) {
this.table = table;
table.getModel().addTableModelListener(getTableModelListener());
}

private TableModelListener getTableModelListener() {
TableModelListener l = new TableModelListener() {

@Override
public void tableChanged(TableModelEvent e) {
if (!blocked) return;
if (e.getType() == TableModelEvent.INSERT) {
updateInsert(e.getFirstRow(), e.getLastRow());
}
}

};
return l;
}

protected void updateInsert(int firstRow, int lastRow) {
// PENDING: assumption is that insert always above
// need additional logic for other cases
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
Rectangle r = table.getVisibleRect();
int row =table.rowAtPoint(new Point(0, r.y + r.height));
int lastVisible = table.getRowCount() - rowsBelow;
table.scrollRowToVisible(lastVisible);
}
});
}

public void block() {
Rectangle viewRect = table.getVisibleRect();
int lastVisibleRow = table.rowAtPoint(new Point(0, viewRect.y + viewRect.height));
rowsBelow = table.getRowCount() - lastVisibleRow;
blocked = true;
}

public void unblock() {
blocked = false;
rowsBelow = -1;
}

}

关于java - 使用 JTable 和 JScroll Pane 进行滚动锁定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7394698/

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