0

我的 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) {
}
4

2 回答 2

4

建议:

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

如需更多帮助,请告诉我们更多关于您的直播课程、它的作用、“捕获”时的作用。

于 2012-05-16T15:41:17.410 回答
4

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

为了防止这种情况,你应该让你的程序多线程。这在任何编程语言中都是一个巨大的话题,但这里有一个简单的例子,它可以在 Java 中使用Swing Worker完成的多种方法之一:

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();
    }
} );
于 2012-05-16T15:44:09.280 回答