0

我知道我一定会为此大吃一惊,但我正在尝试JFrame在其内容窗格中设置一个使用空布局的布局,以便我可以为我的组件使用绝对定位。

我遇到的问题是组件的底部和右侧与窗口边缘之间总是存在这种间隙。我想也许我只是定位/调整大小错误,所以我使用一个单一的测试JPanel并给它与内容窗格相同的边界,但仍然存在差距。

两边相等,看起来是窗口边框宽度的两倍。这是代码:

public static void main(String[] args) {
        JFrame mainWindow = new JFrame("test");
        mainWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel root = new JPanel();
        root.setSize(1280, 720);
        root.setPreferredSize(new Dimension(1280, 720));
        root.setBackground(Color.GREEN);
        root.setLayout(null);
        mainWindow.setContentPane(root);

        JPanel p1 = new JPanel();
        p1.setBounds(root.getBounds());
        p1.setBackground(Color.RED);
        root.add(p1);

        mainWindow.pack();
        mainWindow.setVisible(true);
        mainWindow.setResizable(false);
}

我认为可能不使用布局管理器是问题所在,所以我尝试将根 JPanel 保留为其默认流布局并为 p1 提供首选大小(1280x720)。但是,除了在窗口中居中 p1 之外,这没有任何影响。我也尝试过不更改内容窗格,而是将 root 添加到它,然后将 p1 添加到 root(与上面的代码完全一样,除了调用mainWindow.getContentPane().add(root);而不是mainWindow.setContentPane(root);),但没有任何变化。

在这一点上我唯一能想到的就是当JFrame试图调整自身大小时发生了一些事情。有任何想法吗?

4

2 回答 2

0

我遇到的问题是组件的底部和右侧与窗口边缘之间总是有这个间隙

mainWindow.setResizable(false);

上面的语句应该在帧被打包之前执行。

我知道我一定会为此大吃一惊,但我正在尝试设置一个在其内容窗格中使用空布局的 JFrame,以便我可以为我的组件使用绝对定位

不要使用空布局,除非您的应用程序支持将组件拖动到随机位置。在这种情况下,布局管理器无法预测组件的位置。否则使用布局管理器。

于 2014-05-02T16:45:42.267 回答
0

不太确定这是否是您正在寻找的,但它适用于 BorderLayout:

public static void main(String[] args) {
    JFrame mainWindow = new JFrame("test");
    mainWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    JPanel root = new JPanel(new BorderLayout());
    root.setSize(1280, 720);
    root.setPreferredSize(new Dimension(1280, 720));
    root.setBackground(Color.GREEN);

    JPanel p1 = new JPanel(null);
    p1.setBounds(root.getBounds());
    p1.setBackground(Color.RED);
    root.add(p1);

    mainWindow.setContentPane(root);
    mainWindow.pack();
    mainWindow.setVisible(true);
    mainWindow.setResizable(false);
}
于 2014-05-02T16:39:46.983 回答