3

我有两个这样的 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);
}

界面如下所示(可点击缩略图):

主用户界面 http://bit-stab.com/pictures/dump/MinecraftRemoteAdmin_thumb.jpg

我的问题是,每当我移动两个分隔线的位置时,我都必须按两次该菜单项,然后才能将两个分隔线放回原位。左边的总是第一次,右边的总是第二次。

我尝试更改设置分隔线的顺序(先右后左)。我尝试过无效化,更改分隔符的拆分窗格,两个拆分窗格,两个拆分窗格加上 UI(扩展 JFrame)

我还尝试在按下菜单项时两次运行该方法。或者检查 getDividerLocation() 是否返回我刚刚设置的值(出于某种奇怪的原因它会这样做)。

最后但并非最不重要的一点是,我尝试了以上所有方法的组合。

我的想法不多了,是否有解决此问题的有效方法?

编辑:我创建了一个可运行的示例(来源: http: //pastebin.com/VKtN6zJZ),download.jar

4

1 回答 1

2
setSize(1280, 720);

永远不要对这样的大小进行硬编码。不是每个人都会使用相同分辨率的显示器。也许使用:

frame.setExtendedState(JFrame.MAXIMIZED_BOTH);

或使用 Toolkit 类来获取窗口边界。

setDividerLocation( double )方法仅适用于“已实现”的框架,这意味着在您调用pack()setVisible(true)在框架上之后。

或者,您需要将代码包装在 aSwingUtilities.invokeLater()中以确保代码以正确的顺序执行。就像是

SwingUtilities.invokeLater(new Runnable()
{
    public void run()
    {
        splitPaneLeft.setDividerLocation(165);
        splitPaneRight.setDividerLocation(830);
    }
});

如果这不起作用,那么可能每个语句都需要在单独的 invokeLater() 中完成。

关于分隔线位置的相同评论。不要对值进行硬编码。也许您可以使用setDividerLocation(.25f)按百分比而不是绝对值分配大小的方法。

于 2013-12-16T23:29:15.497 回答