add方法对setContentPane有什么区别?

时间:2013-09-05 04:59:06

标签: java swing jframe layout-manager

此代码输出一个框架,其中按钮放在图像上。如果我将语句从fr.setContentPane( new JPanel...更改为fr.add(new JPanel...,我只会看到大小为700,700的按钮。有什么区别?

public class Tester {

    public static void main(String args[]) {
        try {
            JFrame fr = new JFrame();
            fr.setContentPane(new JPanel() {
            BufferedImage image = ImageIO.read(new File("C:\\Users\\user\\Documents\\NetBeansProjects\\JavaApplication1\\src\\javaapplication1\\meaning.JPG"));
                @Override
                public void paintComponent(Graphics g) {
                   super.paintComponent(g);
                   g.drawImage(image, 0,0,700,700, this);

                 }
            });
            fr.add(new JButton("Press Me"));
            fr.setSize(700,700);
            fr.setVisible(true);
            fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            fr.setResizable(false);
        }catch(Exception exc) {
            exc.printStackTrace();
        }
    }        
}

1 个答案:

答案 0 :(得分:3)

JFrame#add基本上会调用JFrame#getContentPane().add,所以它只是简写。

所以你的代码实际上在说......

fr.setContentPane(new JPanel() {...});
fr.getContentPane().add(new JButton("Press Me"));

现在,当您注释掉setContentPane行时,JFrame默认情况下会使用BorderLayout,现在按钮位于CENTER位置(框架的默认内容窗格,并填充整个可用空间。

通过调用...

,您可以获得与原始代码相同的效果
JPanel background = new JPanel() {...};
background.add(new JButton("Press Me"));
fr.add(background);

请查看Using top-level containersHow to use Root Panes了解详情