GridBagLayout 和 JFrame 内容窗格

GridBagLayout and JFrame Content Pane

我目前正在尝试正确对齐框架内的一些组件。我正在为此使用 GridBagLayout,但看起来这条线造成了麻烦:

frame.setContentPane(new ImagePanel(myImage));  

我想将按钮居中放置在中间,但它没有 work.If 我评论它,一切正常。还尝试使用 BorderLayout 和 CENTER 创建另一个面板,但结果相同。我想要我的 JFrame 的背景图像。我应该怎么办 ?还是我做错了什么?

private Image image;
public MainClass(Image image){
        this.image = image;
        GridBagConstraints c = new GridBagConstraints();
        this.setOpaque(false);
        this.setLayout(new GridBagLayout());
        c.gridx = 0;
        c.gridy = 0;
        this.add(new JButton("1"), c);
        c.gridx = 0;
        c.gridy = 1;
        this.add(new JButton("2"), c);
        c.gridx = 0;
        c.gridy = 2;        
        this.add(new JButton("3", c);       
    }
 protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.drawImage(image, 0, 0, this);
        }
    public static void main(String[] args) throws IOException {
        BufferedImage myImage = ImageIO.read(new File("images/city.png"));
        JFrame frame = new JFrame();
        frame.setContentPane(new MainClass(myImage));
        frame.setSize(600, 375);
        frame.setUndecorated(true);
        frame.setVisible(true);
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        }
}

//edit : 我刚刚意识到我正在尝试将面板添加到我的框架中.. 乍一看效果很好。

最直接和残酷的答案是 - 不要使用 Java Swings 的布局管理器,它们在大多数情况下几乎无法使用。尝试一些第三方

我强烈推荐 http://www.miglayout.com/ 的 MIG Layout,它非常强大、灵活、易于使用,并带有不错的文档和示例。

    frame.setContentPane(new ImagePanel(myImage));  
    frame.add(new MainClass());

首先将 ImagePanel 设置为内容窗格,这样就可以了。然后将 MainClass() 添加到可能没问题的框架中。这意味着 MainClass 将被添加到 ImagePanel。

If i comment it,everything works good.

默认情况下,JPanel 使用 FlowLayout,因此 MainClass 将在面板顶部居中。

您需要将 ImagePanel 的布局设置为 BorderLayout。然后它应该像直接将 MainClass 添加到框架中一样工作。

JLabel 背景 = new JLabel(new ImageIcon(ImageIO.read(...))); setContentPane(背景)

...

添加所有其他按钮