【问题标题】:Update JTextFields during an ActionPerformed in Java在 Java 中的 ActionPerformed 期间更新 JTextFields
【发布时间】:2017-04-06 16:01:55
【问题描述】:

我想在按钮单击操作完成之前完成一些代码后一个接一个地更新 4 个 JTextField。目前使用 start() 和 join() 如下所示,但它只是在 actionPerformed 结束时更新。有什么想法吗?

public void jBsendActionPerformed(ActionEvent e) {
            try{
        selectedPort=jCports.getSelectedItem().toString();

        //Thread t1;
        Thread t1 = new Thread(new Runnable() {
            @Override
            public synchronized void run() {
                try {
                    String data = "*"+jTx.getText()+jTy.getText()+jTx1.getText()+jTy1.getText()+jTl1.getText()+jTb1.getText()+"#";
                    obj.writeData(selectedPort, data);
                    String RFID1=obj.readData(selectedPort);
                    jTrfid1.setText(RFID1); // Want to update this textfield before executing the rest of the code, same for the next three textfields
                    System.out.println(RFID1);
                } catch (SerialPortException ex) {
                    Logger.getLogger(RoboGUI.class.getName()).log(Level.SEVERE, null, ex);
                }
            } 
        });

        t1.start();
        t1.join();
        Thread t2 = new Thread(new Runnable() {
            @Override
            public synchronized void run() {
                try {
                    String data = "*"+jTx2.getText()+jTy2.getText()+jTl2.getText()+jTb2.getText()+"#";
                    obj.writeData(selectedPort, data);
                    String RFID2=obj.readData(selectedPort);

                } catch (SerialPortException ex) {
                    Logger.getLogger(RoboGUI.class.getName()).log(Level.SEVERE, null, ex);
                }
            } 
        });

        t2.start();
        t2.join();
        Thread t3 = new Thread(new Runnable() {
            @Override
            public synchronized void run() {
                try {
                    String data = "*"+jTx3.getText()+jTy3.getText()+jTl3.getText()+jTb3.getText()+"#";
                    obj.writeData(selectedPort, data);
                    String RFID3=obj.readData(selectedPort);
                    jTrfid3.setText(RFID3);
                    System.out.println(RFID3);
                } catch (SerialPortException ex) {
                    Logger.getLogger(RoboGUI.class.getName()).log(Level.SEVERE, null, ex);
                }
            } 
        });
        t3.start();
        t3.join();
        Thread t4 = new Thread(new Runnable() {
            @Override
            public synchronized void run() {
                try {
                    String data = "*"+jTx4.getText()+jTy4.getText()+jTl4.getText()+jTb4.getText()+"#";
                    obj.writeData(selectedPort, data);
                    String RFID4=obj.readData(selectedPort);
                    jTrfid4.setText(RFID4);
                    System.out.println(RFID4);
                } catch (SerialPortException ex) {

                }
            } 
        });
        t4.start();
        t4.join();
        }

我也尝试过 swingworker 和 swingutilites。但仍然无法正常工作..请帮助..

【问题讨论】:

  • 您不想创建多个线程。您无法控制它们的执行顺序。您只需要一个线程一次处理一个请求,然后发布每个请求的结果。我认为 SwingWorker 没有理由不工作。只需确保在收到值后“发布”该值。阅读 Concurrency 上的 Swing 教程部分了解更多信息。

标签: java multithreading swing user-interface concurrency


【解决方案1】:

您应该在 ui 线程(事件调度)上更新 swing 组件的状态。在您的情况下,就在 jBsendActionPerformed 方法中,而不是在其他线程上。或者调用 SwingUtilities.invokeLater 方法,当你想从其他线程更新时,在这个方法中更新 gui 的状态。

我认为更好的解决方案是使用 swing worker。

public void jBsendActionPerformed(ActionEvent e) {
    selectedPort=jCports.getSelectedItem().toString();
    final String data = "*"+jTx.getText()+jTy.getText()+jTx1.getText()+jTy1.getText()+jTl1.getText()+jTb1.getText()+"#",
                 data1 = "*"+jTx2.getText()+jTy2.getText()+jTl2.getText()+jTb2.getText()+"#",
                 data2 = "*"+jTx3.getText()+jTy3.getText()+jTl3.getText()+jTb3.getText()+"#",
                 data3 = "*"+jTx4.getText()+jTy4.getText()+jTl4.getText()+jTb4.getText()+"#";
    new SwingWorker<Void, String>() {
        int messageInd = 0;

        @Override
        protected Void doInBackground() throws Exception {
            //will be called on worker thread
            try {
                obj.writeData(selectedPort, data);
                String RFID1=obj.readData(selectedPort);
                push(RFID1);
                System.out.println(RFID1);
            } catch (SerialPortException ex) {
                Logger.getLogger(RoboGUI.class.getName()).log(Level.SEVERE, null, ex);
            }

            try {
                obj.writeData(selectedPort, data1);
                String RFID2=obj.readData(selectedPort);
                push(RFID2);    
                System.out.println(RFID2);
            } catch (SerialPortException ex) {
                Logger.getLogger(RoboGUI.class.getName()).log(Level.SEVERE, null, ex);
            }

            try {
                obj.writeData(selectedPort, data2);
                String RFID3=obj.readData(selectedPort);
                push(RFID3);
                System.out.println(RFID3);
            } catch (SerialPortException ex) {
                Logger.getLogger(RoboGUI.class.getName()).log(Level.SEVERE, null, ex);
            }

            try {
                obj.writeData(selectedPort, data3);
                String RFID4=obj.readData(selectedPort);
                push(RFID4);
                System.out.println(RFID4);
            } catch (SerialPortException ex) {

            }
            return null;
        }

        @Override
        protected void process(List<String> rfids) {
            //will be called on ui thread
            for(String rfid : rfids) {
                if( messageInd==0 )
                    jTrfid1.setText(rfid);
                else if( messageInd==1 )
                    jTrfid2.setText(rfid);
                else if( messageInd==2 )
                    jTrfid3.setText(rfid);
                else if( messageInd==3 )
                    jTrfid4.setText(rfid);
                messageInd++;
            }
        }
    }.execute();
}

【讨论】:

  • 与不从 EDT 外部更新 UI 一样重要的是,您应该避免从 EDT 外部从 UI 获取信息,因为您冒着竞争条件的风险
猜你喜欢
  • 1970-01-01
  • 2017-11-25
  • 1970-01-01
  • 1970-01-01
  • 2013-02-03
  • 2012-09-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多