当我切换标签时,JXMultiSplitPane正在疯狂

时间:2011-08-21 01:09:18

标签: java swing jtabbedpane swingx jxmultisplitpane

我正在使用JXMultiSplitPane(来自SwingX 1.6.2)来实现三窗格水平界面。在中心窗格中有一个JTabbedPane,其中有两个标签:一个标有JTextArea(当然是JScrollPane),用于输入Markdown代码,另一个JEditorPane(再次,在滚动窗格中),用于显示呈现的HTML预览。当用户切换到预览窗格时,编辑器中的文本将被处理并显示在预览窗格中。

我的问题是,如果我在编辑器中用长行输入文本,然后切换到预览,则中心窗格将展开。有时它只是一点点,有时它占用的空间比实际屏幕上的空间要多。但是如果我手动移动其中一个调整大小手柄,一切都会恢复原位。

我发现只有两种方法可以解决这个问题:

  1. 在输入任何文字之前,手动调整其中一个窗格。
  2. 在MultiSplitLayout模型中为中心窗格指定权重1。
  3. 我无法使用第二个,因为它会将中心窗格扩展为默认占据几乎整个窗口。

    有没有办法解决这个问题?

    更新

    经过多一点测试后,即使是技术(2)也不能保持大小不变​​;在两个标签之间切换会稍微改变中央窗格的大小。

    我现在认为问题部分在于选项卡式窗格。 JTextAreaJEditorPane的大小不同,JTabbedPane在我们之间切换时会调整大小(因为我每次都会重置JEditorPane文本。不会有问题,只有JXMultiSplitPane会自动调整中心窗格的大小,直到用户通过手动调整大小来强制特定大小。

    所以我应该能够通过固定JTabbedPane的大小来解决问题,但仍然能够通过句柄栏调整大小。有关这方面的任何提示吗?

1 个答案:

答案 0 :(得分:1)

MultiSplitLayout是一个LayoutManager,所以你必须了解它是如何工作的(我也是,我自己也不太熟悉它:-)

基本布局根据组件的prefSize进行,权重用于分配相对于pref的多余/缺失空间。默认情况下,分隔符是“浮动的”,即它们位于组件之间,由基本机制布置。当用户触摸分频器时,分频器“不浮动”,其大小适合于分频器之间。这就是你在移动分隔器一次之后没有看到尺寸贪婪的原因。所以有一条出路就是

  • 像往常一样设置JXMultiSplitPane,添加组件并实现框架
  • 在经理完成初始布局后修复分隔线

    String layout = "(ROW " +
        "(LEAF name=selector weight=0.15)" +
        "(LEAF name=center weight=0.7)" +
        "(LEAF name=list weight=0.15)" +
    ")";
    
    JXMultiSpitPane pane = new JXMulitSplitPane((MultiSplitLayout.parseModel(layout))
    // add components and realize the frame  
    ...
    pane.getMultiSplitLayout().setFloatingDividers(false);
    

或者,为权重赋予更多权重 - 强制layoutManager将它们用于布局本身(而不是仅用于分配多余/缺失空间)。一个副作用是comps的prefSize可能被设置(通过布局,这是一个不,从不,但谁是完美的;-)

   pane.getMulitSplitLayout().setLayoutByWeights(true);

不确定我喜欢哪种方式,或者在多分裂中是否/如何使这更容易..