JTable更改后,JScrollBar不会更新其最大值

时间:2017-09-27 18:03:16

标签: java swing jscrollpane

我有一个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上调用updateUIJTable方法,但这没有用。

2 个答案:

答案 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();