我有一个JFrame
包含两个嵌套JSplitPane
s。我希望在启动时将它们设置为确切的比例。等待JFrame在继续之前加载?
我不能使用setDividerLocation(int)
,因为我不知道框架的尺寸(我在启动时将其最大化)。所以,我使用比例版本setDividerLocation(double)
。
代码:
// ...
JSplitPane left = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT);
JSplitPane right = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT);
right.setResizeWeight(1); // So that I can move the dividers independently
left.setLeftComponent(scrollPane1);
right.setLeftComponent(scrollPane2);
right.setRightComponent(scrollPane3);
left.setRightComponent(right);
add(left, BorderLayout.CENTER);
add(statusLabel, BorderLayout.PAGE_END);
setVisible(true);
setExtendedState(getExtendedState() | JFrame.MAXIMIZED_BOTH);
left.setDividerLocation(0.3);
right.setDividerLocation(0.7);
// ...
现在,有时候这工作完全正常,但有时它不会改变分隔。我相信这是因为画面没有加载。从setDividerLocation(double)
文档:
如果拆分窗格没有正确实现并在屏幕上,该方法将不起作用(新分频器位置将成为(电流大小* proportionalLocation),其为0)。
有没有办法等到框架“屏幕上”?这可能大约需要几毫秒,但它仍然会在启动时破坏布局。我不喜欢使用固定值Thread.sleep
,但某种方式适用于Swing。
编辑:我试过hackBehe建议。它没有工作,所以它可能不是时间。
编辑2:我调试了一些。看起来这是由于我的调整大小权重设置为1.但是这是我的布局所要求的。
这可能是一个解决方案吗? http://www.jguru.com/faq/view.jsp?EID=27191 – Behe
@Behe Nope,尝试黑客,但它没有奏效。可能与其他事情有关。 – Pietu1998
你能举一个例子来重现问题吗? – Behe