java Swing : How to pass value by pressing one button while other button is already pressed

标签 java swing

我正在使用 Java swing 和 Matlab 开发一个项目。我有一个带有 2 个按钮“运行”和“暂停”的 GUI。我正在使用另外一个 java 程序 (Matlabjavaprog.java),其中运行循环如下:

int pause = 0;
for (int i=0; i<10; i++) {
    if (pause == 20000) {
        try { 
            Thread.sleep(pause); 
            System.out.println("Now delayed for 20s!");
        } catch (InterruptedException ie) {} 
    } else {
        proxy.setVariable("n", i);
        proxy.eval("n=n+1");
        proxy.feval("myfun");
    }
}

当我按下“运行”按钮时,else部分就会执行。但我想在这个循环之间按下“暂停”按钮,其中暂停值(20000)将从GUI传递给java程序,并且执行应延迟20000毫秒。但是,在“运行”执行循环之前,我无法按“暂停”按钮。

“运行”按钮:

JButton btnNewButton = new JButton("Run");
        btnNewButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                pauseButton.setEnabled(true);
                prog1.main(args); // a java program that calls another program Matlabjavaprog.java (which calls an instance of Matlab)
                }
        });     

“暂停”按钮:

pauseButton = new JButton("Pause");
        pauseButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                int p =20000;
                Matlabjavaprog.getpause(p); // a function in Matlabjavaprog java program that passes pause value from GUI to this program
            }
        });

实际上,“运行”会创建与 MATLAB 的 TCP 连接,并在其中运行数据集的多个实例。整个过程不能放入线程中,因为它不允许重新连接,因为它已经有一个连接。似乎一旦我按下“运行”,我就无法按下“暂停”,直到运行完成。有没有办法执行“暂停”按钮,可以根据用户需要延迟循环?目前,我无法将暂停值发送到正在运行的程序,即 Matlabjavaprog.java。任何帮助将不胜感激!

最佳答案

如何通过实现 Runnable 将执行放在另一个线程中并使用 AtomicBoolean

例如

AtomicBoolean isPaused = new AtomicBoolean(false);
new Thread(new Runnable(){
    public void run(){
       while(true){
       if(isPaused.get()){
         Thread.sleep(20000);
         isPaused.set(false);
       }
       proxy.setVariable("n", i);
       proxy.eval("n=n+1");
       proxy.feval("myfun");
      }
   }
}).start()

然后在暂停按钮中,调用一个 setter 来调用 isPause.set(true) ,这应该使其可点击。无论如何,这都是一个开始 - 为了简单起见,我喜欢使用原子在线程之间发送信号。

关于java Swing : How to pass value by pressing one button while other button is already pressed,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35018671/

相关文章:

java - 为 Swing 应用程序选择哪个 LayoutManager?

java - 为什么我得到 "Static Error: This class does not have a static void main method accepting String[]."即使我有它?

java - 如何以编程方式配置 Tomcat 的 session 跟踪模式

java - 在 Java 中缓冲 inputStream 时出现奇怪的 IOException

java - 如何访问外部类的公共(public)方法以便在 JPanel 上重绘?

java - 向 JButton 添加关闭操作

java - 在享元模式中将静态实例分配给非静态实例

java - 启用 Web 的 .EXE

java - 如何在 JFrame 中的另一个 JPanel 之上显示/隐藏 JPanel?

java - 无法从 JTable 中删除空白行