我正在构建一个使用JSplitPanes的Java swing应用程序。有时当我测试我的应用程序时,JSplitPanes会在某些操作后跳转到默认位置。我可以将分隔符移动到任何位置,但是某个动作总是会导致分隔符跳转到程序首次打开时的相同位置。
我的代码太大而无法展示样本,所以我想知道一般会导致什么原因。
我尝试过的一件事就是调用revalidate(),这确实阻止了JSplitPanes的跳转。但是,它导致另一个系统(一个使我们的菜单动态化的系统)完全停止工作。
有没有办法在不破坏动态菜单系统的情况下阻止JSplitPanes跳跃?
答案 0 :(得分:1)
所以我无法找到问题的根源,但我确实找到了一个可以很好地解决问题的方法:
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,但是在考虑如何去做,并测试它并且它起作用的时候,我提出了这个想法。
答案 1 :(得分:0)
如果这是导致跳转的单元格的宽度和高度,那么您可能有兴趣将左右组件放入jscrollpane(设置滚动到隐藏)。
通常情况下,如果一侧没有足够的空间,并且它会重新调整父级的大小。我使用带有隐藏卷轴的jscrollpane来更好地控制我的对象。这是我的想法。如果有人有更好的解决方案,下次也可以帮到我。