我有一个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引起的。但这是我的布局所必需的。
答案 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);