java:netbeans gui按钮不能同时工作

时间:2012-05-16 15:31:09

标签: java swing user-interface jbutton

我的Netbeans GUI表单上有两个按钮。一个按钮是启动按钮,另一个是停止按钮。当我按下开始按钮时,我的代码运行良好,但是当我尝试停止时,停止按钮似乎被禁用。我无法按下停止按钮。

我的代码从GUI开始,其中这是我的启动按钮

的代码
private void jButton2MouseClicked(java.awt.event.MouseEvent evt) {
    live p=new live(); //this calls the method of my application
    p.livecapture();
}

停止按钮的代码

private void jButton1MouseClicked(java.awt.event.MouseEvent evt) {
    mm=2;
}

我的livecapture()方法

中存在以下while循环
while(NewJFrame.mm!=2) {
}

2 个答案:

答案 0 :(得分:4)

建议:

  • 确保您的捕获循环不在事件线程中。
  • 如果在事件线程中将其移开或使用Swing Timer。
  • 为捕获类提供一个状态变量,该变量将停止循环,并为其他类提供一个setter方法,使其能够停止循环。
  • 在它的循环中,让它检查其状态变量,如果设置,则停止循环。
  • 请阅读并遵循Swing命名约定。你的代码不遵守它们,这使得外人(我们!)难以阅读和理解它。

如需更多帮助,请告诉我们更多关于您的现场课程,它的作用,以及“捕捉”时的作用。

答案 1 :(得分:4)

我不确定你的情况,但听起来你正在从事件调度线程(EDT)执行你的代码。这是程序中负责监听GUI生成的事件(以及其他内容)的线程。如果您的EDT正在忙于处理侦听器中用于启动按钮的代码,那么对于发生的任何其他按钮,它将是盲目的。

为了防止这种情况,您应该使程序成为多线程的。这是任何编程语言中的一个重要主题,但这里有一个简单的例子,说明了使用Swing Worker在Java中完成的许多方法之一:

class MyWorker extends SwingWorker<Void, Void> {
    public Void doInBackground() {
        // The code you want to run
        return Void;
    }
}

MyWorker thread = new MyWorker();

startButton.addActionListener( new ActionListener() {
    public void actionPerformed( ActionEvent e ) {
        thread.execute();
    }
} );

endButton.addActionListener( new ActionListener() {
    public void actionPerformed( ActionEvent e ) {
        thread.cancel();
    }
} );