我正在构建一个使用JSplitPanes的Java swing应用程序。有时,当我测试我的应用程序时,在执行某些操作后,JSplitPanes会跳到默认位置。我可以将分隔线移动到任何位置,但是某些操作总是导致分隔线跳到程序首次打开时的相同位置。
我的代码太大,无法显示其中的示例,因此我想大致了解是什么原因引起的。
我尝试过的一件事是调用revalidate(),但这确实阻止了JSplitPanes的跳转。但是,这导致另一个系统(一个使我们的菜单动态化的系统)完全停止工作。
有没有办法在不破坏动态菜单系统的情况下阻止JSplitPanes跳转?
最佳答案
因此,我无法找到问题的根源,但确实找到了解决该问题的方法:
splitPane.addPropertyChangeListener(JSplitPane.DIVIDER_LOCATION_PROPERTY,
new java.beans.PropertyChangeListener() {
@Override
public void propertyChange(java.beans.PropertyChangeEvent pce) {
SwingUtilities.invokeLater(
new Runnable() {
public void run() {
Component left = splitPane.getLeftComponent();
Component right = splitPane.getRightComponent();
left.setPreferredSize(left.getSize());
right.setPreferredSize(right.getSize());
}
});
}
});
基本上,当调整JSplitPane的大小时,它将设置其两个内部组件的首选大小,然后将其用于确定分隔器的位置。稍后调用该调用也是必需的,因为没有它就无法工作。
我本来打算做一个SSCCE,但是我在考虑如何进行操作时想出了这个主意,并对其进行了测试并奏效。