我正在使用JXMultiSplitPane
(来自SwingX 1.6.2)来实现三窗格水平界面。在中心窗格中有一个JTabbedPane
,其中有两个标签:一个标有JTextArea
(当然是JScrollPane
),用于输入Markdown代码,另一个JEditorPane
(再次,在滚动窗格中),用于显示呈现的HTML预览。当用户切换到预览窗格时,编辑器中的文本将被处理并显示在预览窗格中。
我的问题是,如果我在编辑器中用长行输入文本,然后切换到预览,则中心窗格将展开。有时它只是一点点,有时它占用的空间比实际屏幕上的空间要多。但是如果我手动移动其中一个调整大小手柄,一切都会恢复原位。
我发现只有两种方法可以解决这个问题:
我无法使用第二个,因为它会将中心窗格扩展为默认占据几乎整个窗口。
有没有办法解决这个问题?
经过多一点测试后,即使是技术(2)也不能保持大小不变;在两个标签之间切换会稍微改变中央窗格的大小。
我现在认为问题部分在于选项卡式窗格。 JTextArea
和JEditorPane
的大小不同,JTabbedPane
在我们之间切换时会调整大小(因为我每次都会重置JEditorPane
文本。不会有问题,只有JXMultiSplitPane
会自动调整中心窗格的大小,直到用户通过手动调整大小来强制特定大小。
所以我应该能够通过固定JTabbedPane
的大小来解决问题,但仍然能够通过句柄栏调整大小。有关这方面的任何提示吗?
答案 0 :(得分:1)
MultiSplitLayout是一个LayoutManager,所以你必须了解它是如何工作的(我也是,我自己也不太熟悉它:-)
基本布局根据组件的prefSize进行,权重用于分配相对于pref的多余/缺失空间。默认情况下,分隔符是“浮动的”,即它们位于组件之间,由基本机制布置。当用户触摸分频器时,分频器“不浮动”,其大小适合于分频器之间。这就是你在移动分隔器一次之后没有看到尺寸贪婪的原因。所以有一条出路就是
在经理完成初始布局后修复分隔线
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);
不确定我喜欢哪种方式,或者在多分裂中是否/如何使这更容易..