如何阻止 JSplitPanes 跳转到其默认位置
How to stop JSplitPanes from jumping to its default position
我正在构建一个使用 JSplitPanes 的 Java swing 应用程序。有时,当我测试我的应用程序时,JSplitPanes 在某些操作后跳转到它们的默认位置。我可以将分隔线移动到任何位置,但某些操作总是会导致分隔线跳转到程序首次打开时的相同位置。
我的代码太大,无法显示示例,所以我想大致了解是什么原因造成的。
我尝试过的一件事是取消对 revalidate() 的调用,这确实阻止了 JSplitPanes 的跳跃。但是,它导致另一个系统(使我们的菜单动态化的系统)完全停止工作。
有没有办法在不破坏动态菜单系统的情况下阻止 JSplitPanes 跳转?
如果这是导致跳转的单元格的宽度和高度,那么您可能有兴趣将左右组件放在 jscrollpane 中(将滚动设置为隐藏)。
通常当一侧没有足够的空间时会发生这种情况,它会重新调整父级的大小。我使用带有隐藏卷轴的 jscrollpane 来更好地控制我的对象。那是我的想法。如果有人有更好的解决方案,下次也可能对我有帮助。
所以我无法找到问题的根源,但我确实找到了一个非常有效的解决方法:
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,但是我在思考如何着手时想到了这个想法,并进行了测试并成功了。
我正在构建一个使用 JSplitPanes 的 Java swing 应用程序。有时,当我测试我的应用程序时,JSplitPanes 在某些操作后跳转到它们的默认位置。我可以将分隔线移动到任何位置,但某些操作总是会导致分隔线跳转到程序首次打开时的相同位置。
我的代码太大,无法显示示例,所以我想大致了解是什么原因造成的。
我尝试过的一件事是取消对 revalidate() 的调用,这确实阻止了 JSplitPanes 的跳跃。但是,它导致另一个系统(使我们的菜单动态化的系统)完全停止工作。
有没有办法在不破坏动态菜单系统的情况下阻止 JSplitPanes 跳转?
如果这是导致跳转的单元格的宽度和高度,那么您可能有兴趣将左右组件放在 jscrollpane 中(将滚动设置为隐藏)。
通常当一侧没有足够的空间时会发生这种情况,它会重新调整父级的大小。我使用带有隐藏卷轴的 jscrollpane 来更好地控制我的对象。那是我的想法。如果有人有更好的解决方案,下次也可能对我有帮助。
所以我无法找到问题的根源,但我确实找到了一个非常有效的解决方法:
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,但是我在思考如何着手时想到了这个想法,并进行了测试并成功了。