用 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
设置首选尺寸和颜色)
我正在尝试使用 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
设置首选尺寸和颜色)