所以,我正在尝试学习Java Swing和自定义组件。我创建了一个JFrame,给它一个背景颜色,并添加了一个JPanel:
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(1000, 2000);
frame.setBackground(Color.WHITE);
JPanel jp = new JPanel();
jp.setBackground(Color.BLUE);
jp.setSize(40, 40);
frame.add(jp);
frame.setVisible(true);
结果是1000x2000的窗口呈蓝色(与白色窗口相对,其中有40x40蓝色框)。为什么JPanel扩展超出其指定的大小?
答案 0 :(得分:2)
JFrame
的默认布局管理器为BorderLayout
。在没有约束的情况下向框架添加组件时,它使用BorderLayout.CENTER
作为默认约束。这意味着无论请求的大小如何,组件都会占用所有可用空间。
答案 1 :(得分:2)
使用您的代码,只需添加一行即可更改LayoutManager
的{{1}}。然后,当您添加组件时,它将保持其首选大小。
此外,不是调用JFrame
,而是调用jp.setPreferredSize(new Dimension(40,40))。
并且,您需要在jp.setSize(40,40)
上致电pack()
告诉它布置其组件。
JFrame
此外,您应该阅读可用的所有不同JFrame frame = new JFrame("Testing");
frame.setLayout(new FlowLayout()); // New line of code
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setPreferredSize(new Dimension(1000, 2000)); // Modified line of code
frame.setBackground(Color.WHITE);
JPanel jp = new JPanel();
jp.setBackground(Color.BLUE);
jp.setPreferredSize(new Dimension(40, 40)); // Modified line of code
frame.add(jp);
frame.pack(); // added line of code
frame.setVisible(true);
。 Here是一个很棒的教程。