如何添加按钮来冻结和恢复弹跳球JAVA

时间:2014-04-21 19:42:28

标签: java jpanel

我想在下面的代码中添加2个按钮,这些代码可以让我" FREEZE"和" START"球在窗户上反弹时移动。我在过去的一个小时里一直试图这样做,但我无法弄清楚这一点。我做了一些工作,但它主要是垃圾,如果有人想要请让我知道发布它(避免它,以便不扩展我的编码)。有人可以帮我这个吗? 对任何建议开放。 感谢

import java.awt.*;
import javax.swing.*;

public class BallMoves extends JPanel implements Runnable {
    Color color = Color.red;
    int dia = 30;
    long delay = 40;
    private int x = 1;
    private int y = 1;
    private int dx = 3;
    private int dy = 7;

    protected void paintComponent(Graphics g){
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D)g;
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                RenderingHints.VALUE_ANTIALIAS_ON);
        g.setColor(color);
        g.fillOval(x,y,30,30);   // adds color to circle
        g.setColor(Color.red);
        g2.drawOval(x,y,30,30);   // draws circle
    }



    public void run() {
        while(isVisible()) {
            try {
                Thread.sleep(delay);
            } catch(InterruptedException e) {
                System.out.println("interrupted");
            }
            move();
            repaint();
        }
    }

    public void move() {
        if(x + dx < 0 || x + dia + dx > getWidth()) {
            dx *= -1;
            color = getColor();
        }
        if(y + dy < 0 || y + dia + dy > getHeight()) {
            dy *= -1;
            color = getColor();
        }
        x += dx;
        y += dy;
    }

    private Color getColor() {
        int rval = (int)Math.floor(255);
        int gval = (int)Math.floor(0);
        int bval = (int)Math.floor(0);
        return new Color(rval, gval, bval);
    }

    private void start() {
        while(!isVisible()) {
            try {
                Thread.sleep(25);
            } catch(InterruptedException e) {
                System.exit(1);
            }
        }
        Thread thread = new Thread(this);
        thread.setPriority(Thread.NORM_PRIORITY);
        thread.start();
    }

    public static void main(String[] args) {
        BallMoves test = new BallMoves();
        JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.getContentPane().add(test);
        f.setSize(400,400);
        f.setLocation(200,200);
        f.setVisible(true);
        test.start();
    }
}

更新版本

import java.awt.*;
import java.awt.event.ActionEvent;
import javax.swing.*;

public class BallMoves extends JPanel implements Runnable {
    Color color = Color.red;
    int dia = 30;
    long delay = 40;
    private int x = 1;
    private int y = 1;
    private int dx = 3;
    private int dy = 7;
    private boolean isRunning;

    protected void paintComponent(Graphics g){
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D)g;
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                RenderingHints.VALUE_ANTIALIAS_ON);
        g.setColor(color);
        g.fillOval(x,y,30,30);   // adds color to circle
        g.setColor(Color.red);
        g2.drawOval(x,y,30,30);   // draws circle
    }

    public void run() {
        while(isVisible()) {
            try {
                Thread.sleep(delay);
            } catch(InterruptedException e) {
                System.out.println("interrupted");
            }
            move();
            repaint();
        }
    }

    public void move() {
        if (isRunning) {
        if(x + dx < 0 || x + dia + dx > getWidth()) {
            dx *= -1;
            color = getColor();
        }
        if(y + dy < 0 || y + dia + dy > getHeight()) {
            dy *= -1;
            color = getColor();
        }
        x += dx;
        y += dy;
    }
    }

    private Color getColor() {
        int rval = (int)Math.floor(255);
        int gval = (int)Math.floor(0);
        int bval = (int)Math.floor(0);
        return new Color(rval, gval, bval);
    }

    private void start() {
        while(!isVisible()) {
            try {
                Thread.sleep(25);
            } catch(InterruptedException e) {
                System.exit(1);
            }
        }
        Thread thread = new Thread(this);
        thread.setPriority(Thread.NORM_PRIORITY);
        thread.start();
    }

    public static void main(String[] args) {

    EventQueue.invokeLater(new Runnable() {

        @Override
        public void run() {
            final BallMoves test = new BallMoves();
            JFrame f = new JFrame();

            JButton start = new JButton("start");
            start.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent arg0) {
                test.isRunning = true;
            }
        });

            JButton stop = new JButton("stop");
            stop.addActionListener(new ActionListener() {

                @Override
                public void actionPerformed(ActionEvent arg0) {
                    test.isRunning = false;
                }
            });

            JPanel panel = new JPanel();
            panel.add(start);
            panel.add(stop);

            f.add(panel, java.awt.BorderLayout.NORTH);
            f.getContentPane().add(test);

            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            f.setSize(new Dimension(400, 400));
            f.setLocationRelativeTo(null);
            f.setVisible(true);
            test.start();
        }

    });



}
}

1 个答案:

答案 0 :(得分:1)

创建一个标志,并在按钮单击时将其切换。

private volatile boolean isRunning;

public void move() {
    if (isRunning) {
       // your existing code 
       ...
    }
}

点击开始按钮

 isRunning = true;

点击停止按钮

 isRunning = false;