简体   繁体   English

在Java中执行的操作期间更新JTextFields

[英]Update JTextFields during an ActionPerformed in Java

I want to update 4 JTextFields one after another upon completion of some code before the button click action complete. 我想在按钮单击操作完成之前完成一些代码后,一个接一个地更新4个JTextField。 Currently using start() and join() as shown below, but it is only updating at the end of actionPerformed. 当前使用start()和join(),如下所示,但它仅在actionPerformed末尾进行更新。 Any idea? 任何想法?

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

I tried swingworker and swingutilites also. 我也尝试了swingworker和swingutilites。 but still not working.. Please help.. 但仍然无法正常工作..请帮助..

You should update swing components' state on ui thread(event dispatch). 您应该在ui线程(事件分派)上更新swing组件的状态。 In your case right in the jBsendActionPerformed method, not on other threads. 在您的情况下,请直接在jBsendActionPerformed方法中使用,而不要在其他线程上使用。 or call SwingUtilities.invokeLater method and update gui's state in this method when you want to update from other threads. 或调用SwingUtilities.invokeLater方法并在要从其他线程更新时使用此方法更新gui的状态。

I think a better solution would be using 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();
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM