2014-03-13 81 views
0

我有一个程序在Jpanel中激活一个球。我有两个按钮停止和去。停止停止球移动,去为球移动。在我的球类中,我有一个布尔变量,如果它是真的,那么球移动,如果它是假的,球不移动。所以当我创建框架并在面板中放置球类时,我想在我的主类中,我可以使用按钮将变量更改为false或true,具体取决于按钮的按下。Java动作监听器问题

public class BallTask extends JPanel implements ActionListener{ 


public static boolean run = false; 

public BallTask(){ 
    this.setPreferredSize(new Dimension(width, height)); 
    Thread gameThread = new Thread() { 
     public void run() { 
      while (run) { 

      .... working code 


public static void main(String[] args) { 

    SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 

      JFrame window = new JFrame(); 
      window.setLayout(new BorderLayout()); 
      window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      window.add(new BallTask()); 
      JPanel buttons = new JPanel(); 
      JButton stop = new JButton("STOP"); 
      stop.addActionListener(new ActionListener() { 
       public void actionPerformed(ActionEvent e) { 
        run = false; 
       } 
      }); 
      JButton go = new JButton("GO"); 
      go.addActionListener(new ActionListener() { 
       public void actionPerformed(ActionEvent e) { 
        run = true; 
       } 
      }); 
      buttons.add(go); 
      buttons.add(stop); 
      window.add(buttons,BorderLayout.SOUTH); 
      window.pack(); 
      window.setVisible(true); 
     } 
    }); 

我对代码的问题是,按钮实际上并没有改变BallTask​​类中的布尔值。有任何想法吗?

+2

几个工作示例进行了审查[这里](http://stackoverflow.com/q/9849950/230513)。 – trashgod

+0

那么问题是什么? –

回答

2

看看使用javax.swing.Timer。您的while循环将阻止EDT不允许分派按钮事件。

参见How to use Swing Timers。使用计时器,您可以使用它的方法stopstart来启动和停止计时器。你可以看到一个例子here


以下是使用你的代码Timer可运行的例子。上面链接中的代码更清晰,使用Ball对象。我只是扔在一起真的很快

import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 
import javax.swing.Timer; 

public class BallTask { 

    public static boolean run = false; 
    private Timer timer; 
    private BallPanel ballPanel = new BallPanel(); 

    public BallTask() { 
     timer = new Timer(30, new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       if (ballPanel.x < 0 || ballPanel.x > ballPanel.getWidth()) { 
        ballPanel.dx = -ballPanel.dx; 
       } 
       if (ballPanel.y < 0 || ballPanel.y > ballPanel.getHeight()) { 
        ballPanel.dy = -ballPanel.dy; 
       } 
       // Adjust ball position 
       ballPanel.x += ballPanel.dx; 
       ballPanel.y += ballPanel.dy; 
       ballPanel.repaint(); 
      } 
     }); 
     JPanel buttons = new JPanel(); 
     JButton stop = new JButton("STOP"); 
     buttons.add(stop); 
     stop.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       timer.stop(); 
      } 
     }); 
     JButton go = new JButton("GO"); 
     buttons.add(go); 
     go.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       timer.start(); 
      } 
     }); 

     JPanel mainPanel = new JPanel(new BorderLayout()); 
     mainPanel.add(ballPanel); 
     mainPanel.add(buttons, BorderLayout.SOUTH); 

     JFrame window = new JFrame(); 
     window.add(mainPanel); 
     window.pack(); 
     window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     window.setLocationRelativeTo(null); 
     window.setVisible(true); 

    } 

    private class BallPanel extends JPanel { 

     private int x; 
     private int y; 
     int dx = 4; // Increment on ball's x-coordinate 
     int dy = 4; // Increment on ball's y-coordinate 
     int radius = 15; // Ball radius 

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      g.fillOval(x, y, 30, 30); 
     } 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(500, 300); 
     } 
    } 

    public static void main(String[] args) { 

     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       new BallTask(); 
      } 
     }); 
    } 
}