JPanel上的椭圆形不会在不同的位置进行抽签

时间:2018-01-27 12:53:35

标签: java swing jpanel paintcomponent

每次按下鼠标按钮,我都有一个面板,我必须在上面画球。应该在鼠标按下的位置绘制球。

球被拉得很好,但是每次都在同一个位置绘制,所以除非我移动"左右窗口,不会看到绘制的球。

这是我的代码:

GUIBalls

public class GUIBalls {
public  JFrame frame = new JFrame("Balls");
public  JPanel panel = new JPanel();
private ArrayList<Ball> b = new ArrayList<>();
private Random rnd = new Random();

public GUIBalls(){
    setFrame();
    //moveBalls();
}
public void setFrame(){
    this.frame.setBounds(0,0,400,400);
    this.frame.add(panel);
    panel.setBounds(0,0,400,400);
    this.panel.addMouseListener(new MouseListener() {
        @Override
        public void mouseClicked(MouseEvent e) {
        }

        @Override
        public void mousePressed(MouseEvent e) {
            int x = e.getX();
            int y = e.getY();
            createBalls(x,y);
        }

        @Override
        public void mouseReleased(MouseEvent e) {
        }

        @Override
        public void mouseEntered(MouseEvent e) {
        }

        @Override
        public void mouseExited(MouseEvent e) {
        }
    });
}
public void createBalls(int x, int y){
    Ball ball = new Ball(x,y,10,10);
    this.b.add(ball);
    ball.draw(panel);
    panel.repaint();
}
}

Ball

public class Ball extends JPanel {
int x;
int y;
int z;
int w;

public Ball(int x, int y, int z, int w) {
    this.x = x;
    this.y = y;
    this.z = z;
    this.w = w;
}

public void paintComponent(Graphics g) {
    super.paintComponent(g);
    g.fillOval(0, 0, z, w);

}

public void draw(JPanel panel) {
    panel.add(this);
    panel.setVisible(true);

}
}

由于某些奇怪的原因,球没有被绘制在不同的位置。

附上的图片。 enter image description here enter image description here

任何想法?

1 个答案:

答案 0 :(得分:1)

您的代码现在的问题在于您尝试执行custom painting并尝试创建custom component。您需要决定要使用哪种方法。

有关自定义绘画的基础知识,请阅读Custom Painting上的Swing教程中的部分,该部分有一个显示如何执行此操作的工作示例。好吧,它展示了如何在面板上绘制正方形,但你明白了。

如果要继续添加要绘制的对象,则需要将对象保存在ArrayList中,然后在paintComponent()方法中迭代List以绘制每个对象。这种方法在Custom Painting Approaches中得到了证明。

如果要创建Ball作为组件,则需要确保覆盖获取首选大小以返回Ball的大小。然后,您始终在面板的偏移(0,0)处绘制椭圆。然后,将Ball组件添加到使用空布局的父面板。因为您使用null布局,所以您将使用setLocation(...)方法将Ball定位在父面板上。您还需要使用Ball组件的setSize()方法作为首选大小。