JTable 滚动到指定的行索引
Posted
技术标签:
【中文标题】JTable 滚动到指定的行索引【英文标题】:JTable Scrolling to a Specified Row Index 【发布时间】:2010-10-25 13:53:30 【问题描述】:我有一个位于JScrollPane.
中的 JTable 行在运行时根据我的应用程序中发生的事件添加到表中。当向表中添加新行时,我想让 scoll 窗格滚动到表的底部。
对于 JLists 有 [ensureIndexIsVisible][1]()
强制列表中的特定索引可见。我正在寻找相同的东西,但要寻找 JTable。看起来我可能必须手动移动滚动窗格上的滚动视图,但我认为必须有更简单的方法。
【问题讨论】:
【参考方案1】:很简单,JTable 也有 scrollRectToVisible 方法。如果你愿意,如果添加了新记录,你可以尝试这样的方法使滚动窗格转到底部:
jTable1.getSelectionModel().setSelectionInterval(i, i);
jTable1.scrollRectToVisible(new Rectangle(jTable1.getCellRect(i, 0, true)));
i 是最后添加的记录。
【讨论】:
这运行良好,正如预期的那样,并且像 Jlist 中的 ensureindexisvisible() (或任何该方法)这样的功能。标记为答案的代码无法正常运行。在 5-6 调用更长的列表后,它并没有一直滚动到索引,并且每次滚动时都不会显示整行。一些行被切断。这应该是答案。 简单有效。只是一个问题,第一行的目的是什么?看起来第二行就足够了。顺便说一句,我还需要滚动到特定列,通过设置 getCellRect 的第二个参数它也可以正常工作。 ... new Rectangle() 应该是什么意思? getCellRect() 已经返回一个 Rectangle!jTable1.changeSelection()
怎么样?比jTable1.getSelectionModel().setSelectionInterval(i, i);
好还是差?
仅供参考,我只尝试了 jTable1.scrollRectToVisible(dataTable.getCellRect(row, 0, true)); 并且它有效。 @elmue【参考方案2】:
看这个例子:http://www.exampledepot.com/egs/javax.swing.table/Vis.html
更新:链接现已过时,这是代码(来自http://smi-protege.stanford.edu/repos/protege/protege-core/trunk/src/edu/stanford/smi/protege/util/ComponentUtilities.java)
public static void scrollToVisible(JTable table, int rowIndex, int vColIndex)
if (!(table.getParent() instanceof JViewport))
return;
JViewport viewport = (JViewport)table.getParent();
// This rectangle is relative to the table where the
// northwest corner of cell (0,0) is always (0,0).
Rectangle rect = table.getCellRect(rowIndex, vColIndex, true);
// The location of the viewport relative to the table
Point pt = viewport.getViewPosition();
// Translate the cell location so that it is relative
// to the view, assuming the northwest corner of the
// view is (0,0)
rect.setLocation(rect.x-pt.x, rect.y-pt.y);
table.scrollRectToVisible(rect);
// Scroll the area into view
//viewport.scrollRectToVisible(rect);
【讨论】:
错误而且太复杂了!这可以在一行中完成: table.scrollRectToVisible(table.getCellRect(row,column, true)); 我还必须添加 table.revalidate();在调用此页面上的任何解决方案之前,否则它只会滚动到最后一行之前的行,或者根本不滚动。【参考方案3】:JList 在内部使用scrollRectToVisible 并指定要滚动到的坐标。我认为您将不得不为 JTable 重新编码类似的功能。
【讨论】:
【参考方案4】:第一个答案效果很好,但所选行位于表格底部。所以我创建了这个修改后的版本:
private void scrollToVisible(int rowIndex, int vColIndex )
JTable table = getTablePanel().getTable();
if (!(table.getParent() instanceof JViewport))
return;
if (table.getRowCount()<1)
return;
JViewport viewport = (JViewport)table.getParent();
// view dimension
Dimension dim = viewport.getExtentSize();
// cell dimension
Dimension dimOne = new Dimension(0,0);
// This rectangle is relative to the table where the
// northwest corner of cell (0,0) is always (0,0).
Rectangle rect = table.getCellRect(rowIndex, vColIndex, true);
Rectangle rectOne;
if (rowIndex+1<table.getRowCount())
if (vColIndex+1<table.getColumnCount())
vColIndex++;
rectOne = table.getCellRect(rowIndex+1, vColIndex, true);
dimOne.width=rectOne.x-rect.x;
dimOne.height=rectOne.y-rect.y;
// '+ veiw dimension - cell dimension' to set first selected row on the top
rect.setLocation(rect.x+dim.width-dimOne.width, rect.y+dim.height-dimOne.height);
table.scrollRectToVisible(rect);
现在选定的行位于表格的顶部。
【讨论】:
不,您不需要视口滚动到表格中的任何位置(所有组件都有 getVisibleRect 方法)【参考方案5】:在我看来,设置视口位置比滚动表格要容易得多。以下是我的代码。
public void scrollCellToView(int rowIndex, int vColIndex)
if (!(this.getParent() instanceof JViewport))
return;
JViewport viewport = (JViewport) this.getParent();
Rectangle rect = this.getCellRect(rowIndex, vColIndex, true);
Rectangle viewRect = viewport.getViewRect();
int x = viewRect.x;
int y = viewRect.y;
if (rect.x >= viewRect.x && rect.x <= (viewRect.x + viewRect.width - rect.width))
else if (rect.x < viewRect.x)
x = rect.x;
else if (rect.x > (viewRect.x + viewRect.width - rect.width))
x = rect.x - viewRect.width + rect.width;
if (rect.y >= viewRect.y && rect.y <= (viewRect.y + viewRect.height - rect.height))
else if (rect.y < viewRect.y)
y = rect.y;
else if (rect.y > (viewRect.y + viewRect.height - rect.height))
y = rect.y - viewRect.height + rect.height;
viewport.setViewPosition(new Point(x,y));
【讨论】:
以上是关于JTable 滚动到指定的行索引的主要内容,如果未能解决你的问题,请参考以下文章
UICollectionView:在指定索引处添加项目并滚动到该项目
pandas读取csv数据header参数指定作为列索引的行索引列表形成复合(多层)列索引使用xs函数获取行切面数据(level参数指定行层索引列表key参数指定索引值列表)