2014-02-08 39 views
0

我有一个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.但是这是我的布局所要求的。

+0

这可能是一个解决方案吗? http://www.jguru.com/faq/view.jsp?EID=27191 – Behe

+0

@Behe Nope,尝试黑客,但它没有奏效。可能与其他事情有关。 – Pietu1998

+0

你能举一个例子来重现问题吗? – Behe

回答

1

我找到了一种方法。我向内部JSplitPane添加了一个ComponentListener,它在通过帧最大化调整大小时通知我。当发生这种情况时,我可以安全地设置调整重量。

final JSplitPane left = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT); 
final JSplitPane right = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT); 
left.setDividerLocation(0.3); 
right.setDividerLocation(0.3); 
left.setLeftComponent(scrollPane1); 
right.setLeftComponent(scrollPane2); 
right.setRightComponent(scrollPane3); 
left.setRightComponent(right); 
add(left, BorderLayout.CENTER); 
add(status, BorderLayout.PAGE_END); 
setVisible(true); 
right.addComponentListener(new ComponentAdapter() { 
    @Override 
    public void componentResized(ComponentEvent e) { 
     right.setResizeWeight(1); 
    } 
}); 
setExtendedState(getExtendedState() | JFrame.MAXIMIZED_BOTH); 
+2

随着框架和内容的实现,CompnentResized可以被称为多次,只要当心...... – MadProgrammer

+0

@MadProgrammer是的,但那应该没问题。我没有把它设置为其他任何东西,所以当窗口已经可见时(因此应该加载内容)添加侦听器应该没有关系。这个重量混乱的一件事是调整窗口大小。 : - / – Pietu1998

相关问题