为了账号安全,请及时绑定邮箱和手机立即绑定

我怎样才能让我的按钮工作?java

我怎样才能让我的按钮工作?java

FFIVE 2021-08-13 16:17:03
我知道有很多关于动作监听器等的问题。但是,没有一个可以帮助我解决我的具体问题......无论我尝试哪种方式,我总是会遇到错误。这是我的简单弹跳球程序:public class ControlledBall extends JPanel implements Runnable {    int diameter;    long delay;    private int x;    private int y;    private int vx;    private int vy;    public ControlledBall(int xvelocity, int yvelocity) {        diameter = 30;        delay = 40;        x = 1;        y = 1;        vx = xvelocity;        vy = yvelocity;    }    protected void paintComponent(Graphics g) {        super.paintComponent(g);        Graphics2D g2 = (Graphics2D)g;        g.setColor(Color.blue);        g.fillOval(x,y,30,30);        g.setColor(Color.black);        g2.drawOval(x,y,30,30); //draw    }    public void run() {        while(isVisible()) {            try {                Thread.sleep(delay);            } catch(InterruptedException e) {                System.out.println("Something Went Wrong!");            }            move();            repaint();        }    }    public void move() {        if(x + vx < 0 || x + diameter + vx > getWidth()) {            vx *= -1;        }        if(y + vy < 0 || y + diameter + vy > getHeight()) {            vy *= -1;        }        x += vx;        y += vy;    }    public void stop(){        x=0;        y=0;    }    public class Action implements ActionListener{        public void actionPerformed(ActionEvent e){            stop();        }    }正如您在评论中看到的那样,我尝试了几种不同的技术,但都没有奏效。任何建议将不胜感激。谢谢我得到的主要错误是:non static field cannot be referenced from a static context我认为那是因为我是从 main 方法运行它的。
查看完整描述

1 回答

?
Smart猫小萌

TA贡献1911条经验 获得超7个赞

您真正想做的第一件事是摆脱您的run方法(以及您对 的依赖Runnable)。这确实是在 Swing 中执行定期更新的一种不合适的方式。


Swing 是单线程的,不是线程安全的,您当前的方法有跨线程边界脏读/写的风险。


相反,您想要使用 Swing Timer,请参阅如何使用 Swing 计时器了解更多详细信息。


接下来要做的是添加一个start方法并更新该stop方法以支持使用 Swing Timer...


public class ControlledBall extends JPanel {


    //...


    private Timer timer;


    public void stop() {

        if (timer == null) {

            return;

        }

        timer.stop();

        timer = null;

        x = 0;

        y = 0;

    }


    public void start() {

        if (timer != null) {

            return;

        }

        timer = new Timer(delay, new ActionListener() {

            @Override

            public void actionPerformed(ActionEvent e) {

                move();

                repaint();

            }

        });

        timer.start();

    }

然后,您只需更新开始和停止按钮即可调用这些方法...


    stop.addActionListener(new ActionListener() {

        @Override

        public void actionPerformed(ActionEvent e) {

            ball2.stop();

        }

    });

    //...

    start.addActionListener(new ActionListener() {

        @Override

        public void actionPerformed(ActionEvent e) {

            ball2.start();

        }

    });


查看完整回答
反对 回复 2021-08-13
  • 1 回答
  • 0 关注
  • 137 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信