我想要创建一个框架与一个大面板的流量布局,其中包含几个较小的面板与给定的大小。我想我可以这样做:( JFrame给出了)
private void testLayout() {
JPanel panel = new JPanel();
panel.setBackground(Color.gray);
add(panel);
JPanel panel1 = new JPanel();
panel1.setSize(300, 200);
panel1.setBackground(Color.red);
panel.add(panel1);
}如果我运行这个,我只会得到我的大面板灰色,我只看到一个小的红色广场在我的顶部中间的框架,虽然我把大小设置为300 to和200 to。
发布于 2022-01-08 09:33:15
组件的显示大小由布局管理器决定。一些布局管理器使用方法getSize返回的值,但不使用代码中使用的任何值。
正如您正确地指出的,JPanel的默认布局管理器是FlowLayout,FlowLayout实际上使用方法getPreferredSize返回的值。因此,与其调用方法setSize,不如调用setPreferredSize。下面的代码演示了。(代码之后有更多解释。)
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class PanelTst implements Runnable {
private JFrame frame;
@Override
public void run() {
createAndDisplayGui();
}
private void createAndDisplayGui() {
frame = new JFrame("Panels");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel panel = new JPanel();
panel.setBackground(Color.gray);
JPanel panel1 = new JPanel();
panel1.setPreferredSize(new Dimension(300, 200));
panel1.setBackground(Color.red);
panel.add(panel1);
frame.add(panel);
frame.setSize(450, 300);
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public static void main(String[] args) {
EventQueue.invokeLater(new PanelTst());
}
}内容窗格的默认布局管理器是BorderLayout。在问题中的代码中,实际上是将panel添加到BorderLayout的中心,这意味着它将占用所有可用的空间。
由于您没有为panel设置任何大小,因此它的大小将由其父级的大小决定。因此,在上面的代码中,我显式地设置了JFrame的大小。否则,您只会看到panel1。(我建议你修改上面的代码,自己看看。将frame.setSize(450, 300);替换为frame.pack();)
这就是当我运行上面的代码时的样子。

https://stackoverflow.com/questions/70630664
复制相似问题