JSplitPane重置分配器位置

时间:2013-12-16 20:29:19

标签: java swing jsplitpane

我有两个像这样的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

1 个答案:

答案 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)方法分配大小百分比而不是绝对值。