首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在JTable中冻结行

如何在JTable中冻结行
EN

Stack Overflow用户
提问于 2016-11-13 00:42:16
回答 2查看 889关注 0票数 0

如何冻结JTable中的行?

这应该与Microsoft Excel的工作方式类似,在Microsoft Excel中,用户可以选择一个单元格,然后右键单击并冻结/解冻行。我找到了很多关于冻结列的答案,但没有找到行。

谢谢!

EN

回答 2

Stack Overflow用户

发布于 2020-05-17 06:21:08

简而言之,您需要两个JScrollPanes:顶部的一个用于处理冻结的行(具有一个行标题来处理其冻结的列),底部的一个用于可滚动的行(也具有rowheader) -因此您最终需要管理4个表。不要在顶部的滚动窗格中使用滚动条:而是向下面的滚动窗格()的视区中添加一个ChangeListener,如下所示:

代码语言:javascript
复制
   public void stateChanged(ChangeEvent e) {
      Point p = spMain.getViewport().getViewPosition();
      p.y = 0;
      spHead.getViewport().setViewPosition(p);
   }

底部窗格的TableHeader需要隐藏(至少在显示顶部窗格时):

代码语言:javascript
复制
   spMain.setColumnHeaderView(bodyTable.getTableHeader());
   spMain.getColumnHeader().setVisible(false);

我使用的JVM有一个“功能”,它使顶部窗格中的标题与底部的列对齐变得复杂,直到顶部的表至少有一行--只考虑在实际执行“冻结”时才使用顶部窗格。

票数 0
EN

Stack Overflow用户

发布于 2021-06-26 04:47:07

一种简单的方法是重写表模型的getValueAt()方法。

你可以这样做:

代码语言:javascript
复制
Supplier<Integer> firstVisibleRowIndexSupplier = () -> {
  Point p = scrollPane.getViewport()
                      .getViewPosition();
  return table.rowAtPoint(p);
};

firstVisibleRowIndexSupplier传递给表格模型。

在表格模型中:

代码语言:javascript
复制
@Override
public Object getValueAt(int row, int column) {
  int firstVisibleRow = this.firstVisibleRowSupplier.get();
  // Logic for returning data for the frozen rows, based on firstVisibleRow
}

缺点是,当垂直向上滚动时,表格会缓存数据。解决此问题的方法是向垂直滚动条添加一个AdjustmentListener

代码语言:javascript
复制
scrollPane.getVerticalScrollBar()
          .addAdjustmentListener(e -> tableModel.refresh());

使用

代码语言:javascript
复制
// TableModel
public void refresh() {
  // Preserves selection
  fireTableChanged(new TableModelEvent(this, //tableModel
    this.firstVisibleRowSupplier.get(), //firstRow
    getRowCount() - 1, //lastRow
    TableModelEvent.ALL_COLUMNS, //column
    TableModelEvent.UPDATE)); //changeType
}

有了这个变通方法,有一个我还没有找到修复的小缺点:当用鼠标滚轮向上滚动时,冻结的行将在表更新之前短暂闪烁。当使用滚动条滚动或使用滚动条或鼠标滚轮向下滚动时,这种情况不会发生。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40565141

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档