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

时间:2015-11-12 15:42:09

标签: java swing jsplitpane

我正在构建一个使用JSplitPanes的Java swing应用程序。有时当我测试我的应用程序时,JSplitPanes会在某些操作后跳转到默认位置。我可以将分隔符移动到任何位置,但是某个动作总是会导致分隔符跳转到程序首次打开时的相同位置。

我的代码太大而无法展示样本,所以我想知道一般会导致什么原因。

我尝试过的一件事就是调用revalidate(),这确实阻止了JSplitPanes的跳转。但是,它导致另一个系统(一个使我们的菜单动态化的系统)完全停止工作。

有没有办法在不破坏动态菜单系统的情况下阻止JSplitPanes跳跃?

2 个答案:

答案 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来更好地控制我的对象。这是我的想法。如果有人有更好的解决方案,下次也可以帮到我。