【问题标题】:How do I make a graphics change place randomly everytime I click on it每次单击时如何随机更改图形位置
【发布时间】:2021-09-09 03:42:57
【问题描述】:

我编写的代码不会在每次点击时改变球的坐标。

public class AimTrainerPanel extends JPanel implements MouseListener {
    
    static final int WIDTH = 1300;
    static final int HEIGHT = 750;
    static final int SIZE = 10;
    Random rand;
    JLabel cd;
    int x;
    int y;
    boolean running = false;
    Timer timer;
    
    AimTrainerPanel() {
        rand = new Random();
        this.setPreferredSize(new Dimension(WIDTH, HEIGHT));
        this.setBackground(Color.black);
        this.setFocusable(true);
        this.setLayout(null);
        this.addMouseListener(this);
        startGame();
    }
    
    public void startGame() {
        newDot();
        running = true;
        timer = new Timer();
    }

    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        draw(g);
    }
    
    public void draw(Graphics g) {
        if (running) {
            g.setColor(Color.white);
            g.fillOval(x, y, SIZE, SIZE);
        }
    }
    
    public void newDot() {
        x = rand.nextInt((int)(WIDTH/SIZE)) * SIZE;
        y = rand.nextInt((int)(HEIGHT/SIZE)) * SIZE;
    }
    
    @Override
    public void mouseClicked(MouseEvent e) {
        int mx = e.getX();
        int my = e.getY();
        if (mx >= x && mx <= x + 10) {
            if (my >= y && my <= y + 10) {
                newDot();
            }
        }
    }

    @Override
    public void mousePressed(MouseEvent e) {
    }

    @Override
    public void mouseReleased(MouseEvent e) {
    }

    @Override
    public void mouseEntered(MouseEvent e) {
    }

    @Override
    public void mouseExited(MouseEvent e) {
    }
}

newDot() 方法假设每次调用时都会创建新坐标,但球不会改变位置。我不知道是因为我写错了什么,还是因为我所做的没有改变坐标,或者我想添加一些东西。

【问题讨论】:

    标签: java swing user-interface graphics mouse


    【解决方案1】:

    我不确定你的 Timer 应该做什么,但它似乎不是 Swing Timer,因为这是一个 Swing GUI,所以我会去掉它。

    现在是问题的症结所在:

    • 您正在使用mouseClicked,如果鼠标在按下鼠标和释放鼠标之间甚至轻微移动,则不会调用它,因此通常最好使用mousePressedmouseReleased方法而不是mouseClicked
    • 您在更改程序状态后不要调用repaint()。除非您建议,否则 Swing 不会知道需要重新绘制,因此在您的 mouseListener 或由它调用的代码中,您应该在更改 GUI 状态后调用此方法。这里你可以在newDot(...)方法的最后调用它,或者在你调用相同方法之后在鼠标监听器中调用它。
    • 您的鼠标监听器中的 if 块对于它们允许监听器响应鼠标点击的位置似乎非常严格——是不是太严格了?我不知道,因为我不熟悉您的要求,但可能。

    【讨论】:

    • @AndrewThompson:我不能接受自己的答案。如果此评论是针对 OP 的,则可能需要将其放在问题上,以便他们看到。谢谢!
    • “如果这个评论是给 OP 的,” 是的。 “那么可能需要将它放在问题上,以便他们看到它。” 不。当某人收到 cmets 或答案的通知时的规则有点复杂,但对于 OP 来说很简单。他们会收到关于任何答案或问题的每条评论的通知,标记任何人(或没有人)。顺便说一句,他们问了一个new question,但我不会多想,除非他们根据 cmets 改进那个,并接受较早的答案以表明他们可以解决问题,并且是 愿意
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-21
    • 1970-01-01
    相关资源
    最近更新 更多