我有两个像这样的 JSplitPanes
splitPaneRight = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, console, tabPager);
splitPaneLeft = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, infoPanel, splitPaneRight);
splitPaneRight.setResizeWeight(1);
和一个如下所示的方法,通常通过单击其他地方的 JMenuItem 调用:
public void resetLayout()
{
setSize(1280, 720);
splitPaneLeft.setDividerLocation(165);
splitPaneRight.setDividerLocation(830);
}
界面看起来像这样(可点击的缩略图):
Main user interface http://bit-stab.com/pictures/dump/MinecraftRemoteAdmin_thumb.jpg
我的问题是,每当我移动两个分隔线的位置时,我都必须按该菜单项两次,然后两个分隔线才回到原位。左边的总是第一次,右边的第二次。
我试过更改分隔线的设置顺序(先右后左)。我试过使已更改分隔线的拆分 Pane 无效,两个拆分 Pane 以及两个拆分 Pane 加上 UI(扩展 JFrame)
我还尝试在按下菜单项时运行该方法两次。或者检查 getDividerLocation() 是否返回我刚刚设置的值(出于某些奇怪的原因它这样做)。
最后但同样重要的是,我尝试了上述所有方法的组合。
我的想法用完了,是否有解决这个问题的方法?
编辑:我创建了一个可运行的示例(来源:http://pastebin.com/VKtN6zJZ),download.jar
最佳答案
setSize(1280, 720);
永远不要像那样硬编码大小。不是每个人都会使用相同分辨率的显示器。也许使用:
frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
或使用 Toolkit 类获取窗口边界。
setDividerLocation( double )
方法仅适用于“已实现”的框架,这意味着在您调用了 pack()
或 setVisible(true)
在框架上。
或者,您需要将代码包装在 SwingUtilities.invokeLater()
中,以确保代码以正确的顺序执行。有点像
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
splitPaneLeft.setDividerLocation(165);
splitPaneRight.setDividerLocation(830);
}
});
如果这不起作用,那么可能每个语句都需要在单独的 invokeLater() 中完成。
关于分隔线位置的相同评论。不要对值进行硬编码。也许您可以使用 setDividerLocation(.25f)
方法按百分比而不是绝对值分配大小。
关于java - JSplitPane 重置分隔线位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20620274/