2

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

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

在它发生之前,我发现只有两种方法可以解决这个问题:

  1. 在输入任何文本之前手动调整其中一个窗格的大小。
  2. 在 MultiSplitLayout 模型中,将中心窗格的权重设为 1。

我不能使用第二个,因为默认情况下它会扩展中心窗格以占据几乎整个窗口。

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

更新

经过更多测试,即使技术(2)也不能保持大小不变​​;在两个选项卡之间切换会稍微改变中心窗格的大小。

我现在认为问题部分出在选项卡式窗格中。和JTextArea没有JEditorPane相同的大小,并且JTabbedPane当我在它们之间切换时正在调整大小(因为我JEditorPane每次都在重置文本。这不是问题,除非它JXMultiSplitPane会自动调整中心窗格的大小,直到用户强制通过手动调整特定大小。

所以我应该能够通过固定大小来解决这个问题JTabbedPane,但仍然可以通过把手调整大小。有什么建议吗?

4

1 回答 1

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);

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

于 2011-08-23T11:50:46.520 回答