我正在构建一个使用JSplitPanes的Java swing应用程序。有时,当我测试我的应用程序时,JSplitPane会在执行某些操作后跳转到默认位置。我可以将分隔器移动到任何位置,但特定的操作总是会导致分隔器跳到与程序第一次打开时相同的位置。
我的代码太大,无法显示的示例,所以我想知道是什么原因导致了这种情况。
我尝试过的一件事是调用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调整大小时,它会设置其两个内部组件的首选大小,然后使用它们来确定分隔符的位置。invoke later调用也是必要的,因为没有它就无法工作
我本来打算做一个SSCCE,但我在思考如何进行时想出了这个主意,并进行了测试,结果奏效了。
如果这是导致跳转的单元格的宽度和高度,那么您可能有兴趣将左右组件放在jscrollpane中(将滚动设置为隐藏)。
通常情况下,当一侧没有足够的空间时,会发生这种情况,并重新调整父对象的大小。我使用带有隐藏滚动的jscrollpane来更好地控制我的对象。这是我的主意。如果有人有更好的解决方案,下次也可能对我有所帮助。