我有一个JTable
,当点击该行时会展开它并过滤表格中的所有其他行。当用户再次单击此展开的行时,它将返回到正常大小,并且过滤器将再次显示所有表。所有这一切工作正常,但是当从单个展开行的视图返回到整个表时,我想将滚动窗格垂直滚动条值设置为已扩展的行的位置。我正确计算了这个值并尝试用
scrollPane.getVerticalScrollBar().setValue(value);
但正如我在scrollPane.getVerticalScrollBar().getMaximum()
找到的那样,滚动条在sorter.setRowFilter(filter);
调用后不会更新其值。 getMaximum()
返回已展开的单行的高度,因此滚动条无法设置更新的值(通常更大)。这是代码:
// after this call the table shows all its rows again
sorter.setRowFilter(filter);
System.out.println("maximum=" + scrollPane.getVerticalScrollBar().getMaximum());
// shows old value when the table has consisted from a single expanded row
scrollPane.getVerticalScrollBar().setValue(value); // fails
有谁能告诉我如何让滚动条知道JScrollPane
的视图已经改变,以便它可以正确设置其最大值? (虽然滚动条本身似乎没问题,看起来它看起来正确地滚动所有表格)。我试图在revalidate
上调用updateUI
和JTable
方法,但这没有用。
答案 0 :(得分:1)
scrollPane.getVerticalScrollBar().setValue(value);
尝试将上述代码包装在SwingUtilities.invokeLater()中。这会将代码添加到事件队列的末尾。
答案 1 :(得分:0)
您需要重新验证JScrollPane,但只有在使JTable无效之后才能重新验证。因此,像
sorter.setRowFilter(filter);
sorter.invalidate();
// shows old value when the table has consisted from a single expanded row
scrollPane.revalidate();