Java 如何阻止JSplitPanes跳转到其默认位置

Java 如何阻止JSplitPanes跳转到其默认位置,java,swing,jsplitpane,Java,Swing,Jsplitpane,我正在构建一个使用JSplitPanes的Java swing应用程序。有时,当我测试我的应用程序时,JSplitPanes会在某些操作之后跳转到它们的默认位置。我可以将分隔器移动到任何位置,但特定的操作总是会导致分隔器跳转到程序第一次打开时的相同位置 我的代码太大,无法显示的示例,因此我想知道导致这种情况的一般原因 我尝试过的一件事是调用revalidate(),这确实阻止了JSplitPanes跳转。然而,它导致另一个系统(使我们的菜单动态化的系统)完全停止工作 有没有一种方法可以在不破坏动

我正在构建一个使用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也是必要的,因为没有它就无法工作


我本来打算做一个SSCCE,但我在考虑如何进行的时候想到了这个想法,并对它进行了测试,结果成功了

我的代码太大,无法显示样本,
-这就是为什么您需要创建一个示例来演示问题。创建SSCCE时,您可能会发现问题所在
但是,它导致动态菜单完全停止工作
-我们不知道这是什么,这就是为什么您需要发布SSCCE来演示这个概念。SSCCE的目的不是发布你的应用程序,而是让你想一个简单的方法来证明你的概念是导致问题的原因。@camickr谢谢你的建议,我将尝试这个方法多种可能会影响这个,但我可能要调查的第一件事是你的应用程序的最小/最大大小components@MadProgrammer对如果你看我的答案,设置首选尺寸是可以接受的workaround@shieldgenerator7我认为使用preferredSize没有进一步的背景来解释原始问题。在这种情况下,你可能只是用创可贴来掩盖潜在的问题,但我没有你最初的问题的背景sure@MadProgrammer是的,我相信这个“修复”只是一个创可贴。但它可以消除症状,所以现在已经足够好了。我认为在这一点上,我的应用程序将导致此错误,直到我们重构或取出动态菜单系统,这需要使用revalidate(),这将导致拆分窗格跳转。