【问题标题】:How to stop JSplitPanes from jumping to its default position如何阻止 JSplitPanes 跳转到其默认位置
【发布时间】:2015-11-12 15:42:08
【问题描述】:

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

我的代码太大,无法显示示例,所以我想知道一般情况下是什么原因造成的。

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

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

【问题讨论】:

  • My code is too large to show samples of, - 这就是为什么您需要创建一个 SSCCE 来演示问题的原因。在创建 SSCCE 时,您可能会发现问题。 However, it caused the dynamic menus to stop working altogether - 我们不知道这是什么,这就是为什么你需要发布 SSCCE 来展示这个概念。 SSCCE 的目的不是发布您的申请,而是让您想出一种简单的方法来展示导致问题的概念。
  • @camickr 谢谢你的建议,我会试试这个
  • 多种因素可能会影响这一点,但我首先要调查的可能是组件的最小/最大尺寸
  • @MadProgrammer 是的,如果你看看我的回答,设置首选大小是可以接受的解决方法
  • @shieldgenerator7 我认为在没有进一步说明原始问题的情况下使用 preferredSize

标签: java swing jsplitpane


【解决方案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,但我在思考如何去做的时候想到了这个想法,并对其进行了测试,结果它奏效了。

【讨论】:

  • Should I avoid the use of set(Preferred|Maximum|Minimum)Size methods in Java Swing?。在这种情况下,您可能只是用创可贴修复来掩盖潜在问题,但我没有确定您最初问题的背景
  • @MadProgrammer 是的,我相信这个“​​修复”只是一个创可贴。但它摆脱了症状,所以现在已经足够好了。我认为此时我的应用程序会导致这个错误,直到我们重构或取出动态菜单系统,这需要使用revalidate(),这会导致拆分窗格跳转。
【解决方案2】:

如果这是导致跳转的单元格的宽度和高度,那么您可能有兴趣将左右组件放在 jscrollpane 中(将滚动设置为隐藏)。

当一侧没有足够的空间时,通常会发生这种情况,并且它会重新调整父级的大小。我使用带有隐藏滚动条的 jscrollpane 来更好地控制我的对象。这就是我的想法。如果有人有更好的解决方案,下次可能对我也有帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多