JPanel究竟做了什么?据我所知,它创建了我们可以添加组件的内容窗格,这是真的吗?

时间:2014-01-20 09:17:11

标签: java swing jpanel

在下面的代码中,我将背景颜色设置为JFrame的内容窗格为黑色,JPanel为红色。但是,当我尝试setSize()不同大小时,红色区域不会收缩或消耗为什么会这样?

import java.awt.*;
import javax.swing.*;
public class exp{  
    public static void main(String args[]){ 
        JFrame jf=new JFrame("This is JFrame");
        JPanel h=new JPanel();
        h.setSize(400,500);

        h.add(new JButton("Button"));
        h.add(new JLabel("this is JLabel"));
        h.setBackground(Color.RED);

        jf.add(h);
        jf.getContentPane().setBackground(Color.BLACK);
        jf.setLayout(new FlowLayout());


        jf.setVisible(true);
        jf.setSize(600,800);
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }  
}

4 个答案:

答案 0 :(得分:4)

JPanel通常用作组件或其他容器的容器。面板的大小更多地取决于内容的大小以及添加内容的布局和布局约束,而不是其上设置的任何大小。

通过在面板中设置EmptyBorder,可以最大限度地实现这一目标。 E.G。

enter image description here enter image description here

import java.awt.*;
import javax.swing.*;
import javax.swing.border.*;

public class exp{
    public static void main(String args[]){
        Runnable r = new Runnable() {
            public void run() {
                JFrame jf=new JFrame("This is JFrame");
                JPanel h=new JPanel();
                // add more space around the panel!
                h.setBorder(new EmptyBorder(50,50,50,50));

                h.add(new JButton("Button"));
                h.add(new JLabel("this is JLabel"));
                h.setBackground(Color.RED);

                jf.add(h);
                jf.getContentPane().setBackground(Color.BLACK);
                jf.setLayout(new FlowLayout());

                jf.setVisible(true);
                jf.pack();
                jf.setMinimumSize(jf.getSize());
                jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            }
        };
        SwingUtilities.invokeLater(r);
    }
}

答案 1 :(得分:0)

jf.setContentPane(H);

我想你错过了把它设置为contentpane所以它只是另一个小组

答案 2 :(得分:0)

  

但是当我尝试使用不同大小的setSize()时,红色区域不会收缩或消耗为什么会这样?

因为您正在为您的Jframe使用FlowLayout()。尝试使用不同的布局来做你期望的事。喜欢:

替换

jf.setLayout(new FlowLayout());

通过

jf.setLayout(new BorderLayout());

现在更改setSize()中的大小,您将获得预期的输出。

如需更多帮助,请参阅Layout Managers

答案 3 :(得分:-1)

选项1:使用setPreferredSize()而不是setSize()。它将按预期运行。面板将采用上面提到的尺寸(400 * 400)和红色背景颜色。

选项2:如果你要评论这一行(jf.setLayout(new FlowLayout());)它会将整个帧画成红色,因为面板将占据整个帧的大小。

在以下帖子中查看原因: Java: Difference between the setPreferredSize() and setSize() methods in components