java Swing:如何在按下其他按钮的同时按一个按钮来传递值

时间:2016-01-26 16:22:58

标签: java swing

我正在开发一个使用Java swing和Matlab的项目。我有一个带2个按钮的GUI" Run"和"暂停"。我正在使用一个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");
    }
}

当我按下&#34; Run&#34;按钮,else部分执行。但我想按&#34; Pause&#34;在这个循环之间的按钮,其中暂停值(20000)将从GUI传递给java程序,执行应该延迟20000ms。但是,我无法按&#34;暂停&#34;按钮直到&#34;运行&#34;正在执行循环。

&#34;运行&#34;按钮:

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)
                }
        });     

&#34;暂停&#34;按钮:

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
            }
        });

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

1 个答案:

答案 0 :(得分:0)

如何通过实施Runnable并使用AtomicBoolean

将执行放在另一个线程中

e.g。

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()

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