给定内容窗格的边界时,JPanel不填充窗口

时间:2014-05-02 16:17:29

标签: java swing jpanel layout-manager null-layout-manager

我知道我必须为它做好准备,但我正在尝试设置一个在其内容窗格中使用空布局的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尝试调整自身大小时会发生的事情。有什么想法吗?

2 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分:0)

  

我遇到的问题是我的组件的底部和右侧与窗口边缘之间始终存在这种间隙

mainWindow.setResizable(false);

上述陈述应在框架打包之前执行。

  

我知道我必须为它做好准备,但是我试图在其内容窗格中设置一个使用空布局的JFrame,以便我可以为我的组件使用绝对定位

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