我有这个简单的代码,应该在每个面板的左上角有三个面板和绘制和椭圆
public class main1 extends JPanel {
public main1() {
// TODO Auto-generated constructor stub
this.setLayout(new BoxLayout(this, BoxLayout.LINE_AXIS));
JPanel1 panel1 = new JPanel1(Color.YELLOW);
panel1.setBackground(Color.black);
JPanel1 panel2 = new JPanel1(Color.red);
panel2.setBackground(Color.blue);
JPanel1 panel3 = new JPanel1(Color.pink);
panel3.setBackground(Color.green);
this.add(panel1);
this.add(panel2);
this.add(panel3);
}
class JPanel1 extends JPanel{
Color c;
public JPanel1(Color c) {
this.c = c;
}
public void paintComponent(Graphics g){
super.paintComponent(g);
System.out.println(this.getBounds().x);
g.setColor(c);
g.drawOval(this.getBounds().x, this.getBounds().y, 200, 200);
}
}
public static void main(String args[]) {
JFrame f = new JFrame("Two Panels");
f.setContentPane(new main1());
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setSize(300, 300);
f.setVisible(true);
}
}
然而,它似乎只绘制了第一个面板的第一个椭圆并忽略了其余部分。
有人可以解释一下。我究竟做错了什么?
答案 0 :(得分:1)
不要使用getBounds(),因为它会提供相对于其父级的组件位置。使用面板的坐标及其宽度和高度代替。在您的示例中,您将在面板边界外绘画。例如,使用它来绘制椭圆:
g.drawOval(0, 0, getWidth(), getHeight());
一些旁注:
请勿致电setSize()
,覆盖小组getPreferredSize()
和pack()
。例如:
public Dimension getPreferredSize(){return new Dimension(400, 400);}
然后,在使框架可见之前添加frame.pack();
。
请参阅Java Naming Conventions。
有关详细信息,请参阅Performing Custom Painting和Painting in AWT and Swing。