Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java:netbeans gui按钮不能同时工作_Java_Swing_User Interface_Jbutton - Fatal编程技术网

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

java:netbeans gui按钮不能同时工作,java,swing,user-interface,jbutton,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.l

我的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;
}
以下while循环出现在我的
livecapture()方法中

while(NewJFrame.mm!=2) {
}
建议:

  • 确保捕获循环已脱离事件线程
  • 如果在事件线程上,请将其移开或使用Swing计时器
  • 为capture类提供一个将停止其循环的状态变量和一个setter方法,让其他类能够告诉它停止
  • 在它的循环中,让它检查其状态变量,如果设置了,则停止循环
  • 请仔细阅读并遵循Swing命名约定。您的代码不符合它们,这使得外部人员(我们!)很难阅读和理解它

要获得更多帮助,请告诉我们有关您的live类的更多信息,它是做什么的,在“捕获”时它是做什么的

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

为了防止这种情况,您应该使您的程序多线程。这在任何编程语言中都是一个巨大的主题,但下面是一个简单的示例,说明了在Java中可以使用以下方法之一:

类MyWorker扩展SwingWorker{
公共无效doInBackground(){
//要运行的代码
退货无效;
}
}
MyWorker线程=新的MyWorker();
addActionListener(新ActionListener()){
已执行的公共无效操作(操作事件e){
thread.execute();
}
} );
endButton.addActionListener(新ActionListener(){
已执行的公共无效操作(操作事件e){
线程。取消();
}
} );

您需要向我们展示您的代码,以便我们了解问题所在。我的live类捕获接口上的数据包。@Zara:那么它是否在事件线程之外执行此操作?请看Jamie在这方面的出色建议(1+)。我已经添加了完整的live类代码。事实上,我以前使用过swing worker,但我的结果总是很快出现,有时甚至出现错误,这就是为什么我不使用swing worker的原因。@Zara:回去使用SwingWorker并修复您的错误。不要在Swing事件线程EDT上进行这种编码,除非您希望您的程序完全没有响应(正如您现在所经历的那样)。+1;有一个相关的
javax.swing.Timer
示例。
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();
    }
} );