我有两个像这样的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
我的问题是,每当我移动两个分频器的位置时,我必须在两个分频器都回到位之前按下该菜单项两次。左边的一个总是第一次出现,右边出现在第二次。
我尝试更改分隔符的设置顺序(右边第一个,然后左边)。我尝试过无效,更改分隔符的分割窗口,分割窗格以及分割窗格和UI(扩展JFrame)
我也尝试在按下菜单项时运行该方法两次。或者检查getDividerLocation()是否返回我刚刚设置的值(由于一些奇怪的原因它会这样做)。
最后但并非最不重要的是,我尝试过以上所有的组合。
我的想法已经用完,是否存在可行的修复方法?
编辑:我创建了一个可运行的示例(来源:http://pastebin.com/VKtN6zJZ),download.jar
答案 0 :(得分:2)
setSize(1280, 720);
永远不要硬编码这样的尺寸。并非所有人都使用相同的分辨率监视器。也许使用:
frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
或使用Toolkit类获取窗口边界。
有时您需要将代码包装在SwingUtilities.invokeLater()
中以确保代码以正确的顺序执行。像
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
splitPaneLeft.setDividerLocation(165);
splitPaneRight.setDividerLocation(830);
}
});
如果这不起作用,那么每个语句可能需要在一个单独的invokeLater()中完成。
关于分隔符位置的相同评论。不要硬编码值。也许您可以使用setDividerLocation(.25f)
方法分配大小百分比而不是绝对值。