在下面的代码中,我将背景颜色设置为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);
}
}
答案 0 :(得分:4)
JPanel
通常用作组件或其他容器的容器。面板的大小更多地取决于内容的大小以及添加内容的布局和布局约束,而不是其上设置的任何大小。
通过在面板中设置EmptyBorder
,可以最大限度地实现这一目标。 E.G。
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);
}
}
Java GUI可能必须在许多平台上工作,在不同的屏幕分辨率和使用不同的PLAF。因此,它们不利于组件的精确放置或容器的尺寸调整。要组织强大的GUI组件,而是使用布局管理器,或combinations of them 1 ,以及布局填充和& white space 2 的边框。
答案 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