在继续之前等待加载JFrame?

时间:2014-02-08 16:53:40

标签: java swing jframe jsplitpane

我有一个JFrame,其中包含两个嵌套的JSplitPane。我希望它们在启动时设置为一个确切的比例。

我不能使用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。

编辑:我尝试了hack Behe建议。它不起作用,所以可能不是关于时间的。

编辑2:我调试了一些。看来这是由我的调整大小设置为1引起的。但这是我的布局所必需的。

1 个答案:

答案 0 :(得分:1)

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

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