用 JPanel.paintComponent() 绘制两个正方形 - 尺寸错误

Painting two squares with JPanel.paintComponent() - wrong size

我正在尝试使用 JPanel 的 paintComponent() 方法绘制两个定义大小的正方形,一个相邻地排成一行。 这是我到目前为止尝试过的:

1.边框布局

我尝试在 JPanel 的单独子类中绘制每个正方形,然后将这些 JPanel 添加到 JFrame。

结果:正方形被挤压到 JPanel 的对边:高度符合预期,但宽度最小。

JFrame frame = new JFrame();

GreenPanel greenPanel = new GreenPanel();
frame.getContentPane().add(BorderLayout.WEST, greenPanel);
BluePanel bluePanel = new BluePanel();
frame.getContentPane().add(BorderLayout.EAST, bluePanel);

frame.setSize(500, 350);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

class GreenPanel extends JPanel {         
    public void paintComponent(Graphics g) {
        g.setColor(Color.GREEN);
        g.fillRect(0, 0, 100, 100);
    }
}

class BluePanel extends JPanel {         
    public void paintComponent(Graphics g) {
        g.setColor(Color.BLUE);
        g.fillRect(0, 0, 100, 100);
    }
}

2。 FlowLayout

我尝试将带有彩绘方块的 "children" JPanel 添加到 "parent" JPane,然后调用 JFrame.setContentPane(JPanel)。

结果: 正方形在顶部中心区域被绘制为小正方形。

JFrame frame = new JFrame();
JPanel outerPanel = new JPanel();
frame.setContentPane(outerPanel);

GreenPanel greenPanel = new GreenPanel();
outerPanel.add(greenPanel);
BluePanel bluePanel = new BluePanel();
outerPanel.add(bluePanel);

frame.setSize(500, 350);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

class GreenPanel extends JPanel {         
    public void paintComponent(Graphics g) {
        g.setColor(Color.GREEN);
        g.fillRect(0, 0, 100, 100);
    }
}

class BluePanel extends JPanel {         
    public void paintComponent(Graphics g) {
        g.setColor(Color.BLUE);
        g.fillRect(0, 0, 100, 100);
    }
}

我做错了什么?有什么办法可以强制布局管理器遵守用 paintComponent() 绘制的方块的大小?

进行以下更改。请参阅评论以获取解释。

  JFrame frame = new JFrame();
  //add layout manager. You can achieve the desired layout 
  //with GridLayout, Box layout and others 
  frame.getContentPane().setLayout(new GridLayout(1,2));
  GreenPanel greenPanel = new GreenPanel();
  //set preferred size to the panel 
  greenPanel.setPreferredSize(new Dimension(100,100));
  frame.add(greenPanel);
  BluePanel bluePanel = new BluePanel();
  //set preferred size to the panel 
  bluePanel.setPreferredSize(new Dimension(100,100));
  frame.getContentPane().add(bluePanel);

  //let the frame adapt to the panels size 
  //frame.setSize(500, 350); 
  frame.validate();
  frame.pack();
  frame.setVisible(true);
  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

如有需要,请毫不犹豫地要求澄清。


(顺便说一句,覆盖 paintComponent(Graphics g) 并不是真正需要的。您可以简单地为每个 JPanel 设置首选尺寸和颜色)