一、关于JPanel的size问题
当JPanel没有固定的size,而父组件的size变化了,父组件的变化通过什么形式可以传导到JPanel呢?我做了一些试验,结果如下:
1.当父控件不可见时,JPanel的size等于0,父控件可见后,JPanel的size也随之变化。
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(1000, 500);
JPanel panel = new JPanel();
frame.add(panel);
// frame.add(panel)之后。panel: width = 0, height = 0
System.out.printf("frame.add(panel)之后。panel: width = %d, height = %d\n", panel.getWidth(), panel.getHeight());
frame.validate();
// frame.validate()之后。panel: width = 0, height = 0
System.out.printf("frame.validate()之后。panel: width = %d, height = %d\n", panel.getWidth(), panel.getHeight());
frame.setVisible(true);
// frame.setVisible(true)之后。panel: width = 984, height = 459
System.out.printf("frame.setVisible(true)之后。panel: width = %d, height = %d\n", panel.getWidth(), panel.getHeight());
2.当父控件的size变化后,父控件使用revalidate()方法后,JPanel的size也随之变化。
final JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(1000, 500);
frame.setVisible(true);
final JButton big = new JButton("big");
final JButton small = new JButton("small");
final JPanel caoZuoPanel = new JPanel();
caoZuoPanel.setBackground(Color.ORANGE);
caoZuoPanel.add(big);
caoZuoPanel.add(small);
final JPanel tuPanel = new JPanel();
tuPanel.setBackground(Color.PINK);
final JPanel panel = new JPanel();
panel.setLayout(new BorderLayout());
panel.setBackground(Color.BLACK);
panel.add(caoZuoPanel, BorderLayout.NORTH);
panel.add(tuPanel, BorderLayout.CENTER);
frame.add(panel, BorderLayout.CENTER);
frame.revalidate();
frame.setVisible(true);
int width = frame.getWidth();
int height = frame.getHeight();
System.out.printf(
"\n\n---------frame.setSize( %d, %d )之后-----------\n", width, height);
System.out.printf("frame.getContentPane().getWidth() = %d,",
frame.getContentPane().getWidth());
System.out.printf("\t frame.getContentPane().getHeight() = %d\n",
frame.getContentPane().getHeight());
System.out.printf("tuPanel.getWidth() = %d", tuPanel.getWidth());
System.out.printf("\t tuPanel.getHeight() = %d\n", tuPanel.getHeight());
System.out.printf("panel: width = %d, height = %d\n",
panel.getWidth(), panel.getHeight());
big.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
int width = frame.getWidth() + 100;
int height = frame.getHeight() + 100;
frame.setSize(width, height);
frame.revalidate();
System.out.printf(
"\n\n---------frame.setSize( %d, %d )之后-----------\n", width, height);
System.out.printf("frame.getContentPane().getWidth() = %d,",
frame.getContentPane().getWidth());
System.out.printf("\t frame.getContentPane().getHeight() = %d\n",
frame.getContentPane().getHeight());
System.out.printf("tuPanel.getWidth() = %d", tuPanel.getWidth());
System.out.printf("\t tuPanel.getHeight() = %d\n", tuPanel.getHeight());
System.out.printf("panel: width = %d, height = %d\n",
panel.getWidth(), panel.getHeight());
}
});
small.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
int width = frame.getWidth() - 100;
int height = frame.getHeight() - 100;
frame.setSize(width, height);
frame.revalidate();
System.out.printf(
"\n\n---------frame.setSize( %d, %d )之后-----------\n", width, height);
System.out.printf("frame.getContentPane().getWidth() = %d,",
frame.getContentPane().getWidth());
System.out.printf("\t frame.getContentPane().getHeight() = %d\n",
frame.getContentPane().getHeight());
System.out.printf("tuPanel.getWidth() = %d", tuPanel.getWidth());
System.out.printf("\t tuPanel.getHeight() = %d\n", tuPanel.getHeight());
System.out.printf("panel: width = %d, height = %d\n",
panel.getWidth(), panel.getHeight());
}
});