我正在构建一个使用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,但是我在考虑如何进行操作时想出了这个主意,并对其进行了测试并奏效。

10-01 06:43