0

我试过 swingwoker ,但它只会更新一次...... http://piggyman007.blogspot.com/2010/04/java-swingworker-multithread.html

package smartOfficeJava;

import java.awt.event.KeyEvent;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.Event;
import java.awt.BorderLayout;
import javax.swing.SwingConstants;
import javax.swing.SwingUtilities;
import javax.swing.KeyStroke;
import java.awt.Point;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JMenuItem;
import javax.swing.JMenuBar;
import javax.swing.JMenu;
import javax.swing.JFrame;
import javax.swing.JDialog;
import javax.swing.JButton;
import javax.swing.JRadioButton;
import javax.swing.SwingWorker;

import java.awt.GridLayout;
import java.awt.FlowLayout;
import java.awt.Rectangle;
import javax.swing.JCheckBoxMenuItem;
import javax.swing.JRadioButtonMenuItem;
import javax.swing.JToolBar;
import javax.swing.JTextArea;
import java.awt.GridBagLayout;
import java.awt.GridBagConstraints;
import java.util.concurrent.ExecutionException;

public class GUI {
    smartOfficeJava.Arduino arduino = new smartOfficeJava.Arduino();  //  @jve:decl-index=0:
    private JFrame jFrame = null;
    private JPanel jContentPane = null;
    private JMenuBar jJMenuBar = null;
    private JMenu fileMenu = null;
    private JMenu helpMenu = null;
    private JMenuItem exitMenuItem = null;
    private JMenuItem aboutMenuItem = null;
    private JMenuItem saveMenuItem = null;
    private JDialog aboutDialog = null;
    private JPanel aboutContentPane = null;
    private JLabel aboutVersionLabel = null;
    private JMenu selectPort = null;
    private JMenuItem portName = null;
    private JLabel jLabel = null;
    /**
     * This method initializes jFrame
     * 
     * @return javax.swing.JFrame
     */


    SwingWorker worker = new SwingWorker<String, Void>() {
        //This method automatically gets executed in a background thread

        public String doInBackground() {

            //fetch the big list from the 

            String sens = arduino.getSensor();

            return sens;

        }
        //This methods automatically gets executed in the EDT

        public void done() {

            //Get method retuns the exect, same thing 

            //that the doInBackground() method returned
            String sens = null;
            try {
                sens = get();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (ExecutionException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            jLabel.setText(sens);
            //Now do all UI Operations here..
        }

        }; 







    private JFrame getJFrame() {
        if (jFrame == null) {
            jFrame = new JFrame();
            jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            jFrame.setJMenuBar(getJJMenuBar());
            jFrame.setSize(300, 200);
            jFrame.setContentPane(getJContentPane());
            jFrame.setTitle("Application");
        }
        return jFrame;
    }

    /**
     * This method initializes jContentPane
     * 
     * @return javax.swing.JPanel
     */
    private JPanel getJContentPane() {
        if (jContentPane == null) {
            jLabel = new JLabel();
            jLabel.setBounds(new Rectangle(34, 20, 100, 38));
            jLabel.setText("JLabel");
            jContentPane = new JPanel();
            jContentPane.setLayout(null);
            jContentPane.add(jLabel, null);
        }
        return jContentPane;
    }

    /**
     * This method initializes jJMenuBar    
     *  
     * @return javax.swing.JMenuBar 
     */
    private JMenuBar getJJMenuBar() {
        if (jJMenuBar == null) {
            jJMenuBar = new JMenuBar();
            jJMenuBar.add(getFileMenu());
            jJMenuBar.add(getHelpMenu());
            jJMenuBar.add(getSelectPort());
        }
        return jJMenuBar;
    }

    /**
     * This method initializes jMenu    
     *  
     * @return javax.swing.JMenu    
     */
    private JMenu getFileMenu() {
        if (fileMenu == null) {
            fileMenu = new JMenu();
            fileMenu.setText("File");
            fileMenu.add(getSaveMenuItem());
            fileMenu.add(getExitMenuItem());
        }
        return fileMenu;
    }

    /**
     * This method initializes jMenu    
     *  
     * @return javax.swing.JMenu    
     */
    private JMenu getHelpMenu() {
        if (helpMenu == null) {
            helpMenu = new JMenu();
            helpMenu.setText("Help");
            helpMenu.add(getAboutMenuItem());
        }
        return helpMenu;
    }

    /**
     * This method initializes jMenuItem    
     *  
     * @return javax.swing.JMenuItem    
     */
    private JMenuItem getExitMenuItem() {
        if (exitMenuItem == null) {
            exitMenuItem = new JMenuItem();
            exitMenuItem.setText("Exit");
            exitMenuItem.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    System.exit(0);
                }
            });
        }
        return exitMenuItem;
    }

    /**
     * This method initializes jMenuItem    
     *  
     * @return javax.swing.JMenuItem    
     */
    private JMenuItem getAboutMenuItem() {
        if (aboutMenuItem == null) {
            aboutMenuItem = new JMenuItem();
            aboutMenuItem.setText("About");
            aboutMenuItem.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    JDialog aboutDialog = getAboutDialog();
                    aboutDialog.pack();
                    Point loc = getJFrame().getLocation();
                    loc.translate(20, 20);
                    aboutDialog.setLocation(loc);
                    aboutDialog.setVisible(true);
                }
            });
        }
        return aboutMenuItem;
    }

    /**
     * This method initializes aboutDialog  
     *  
     * @return javax.swing.JDialog
     */
    private JDialog getAboutDialog() {
        if (aboutDialog == null) {
            aboutDialog = new JDialog(getJFrame(), true);
            aboutDialog.setTitle("About");
            aboutDialog.setContentPane(getAboutContentPane());
        }
        return aboutDialog;
    }

    /**
     * This method initializes aboutContentPane
     * 
     * @return javax.swing.JPanel
     */
    private JPanel getAboutContentPane() {
        if (aboutContentPane == null) {
            aboutContentPane = new JPanel();
            aboutContentPane.setLayout(new BorderLayout());
            aboutContentPane.add(getAboutVersionLabel(), BorderLayout.CENTER);
        }
        return aboutContentPane;
    }

    /**
     * This method initializes aboutVersionLabel    
     *  
     * @return javax.swing.JLabel   
     */
    private JLabel getAboutVersionLabel() {
        if (aboutVersionLabel == null) {
            aboutVersionLabel = new JLabel();
            aboutVersionLabel.setText("Version 1.0");
            aboutVersionLabel.setHorizontalAlignment(SwingConstants.CENTER);
        }
        return aboutVersionLabel;
    }

    /**
     * This method initializes jMenuItem    
     *  
     * @return javax.swing.JMenuItem    
     */
    private JMenuItem getSaveMenuItem() {
        if (saveMenuItem == null) {
            saveMenuItem = new JMenuItem();
            saveMenuItem.setText("Save");
            saveMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S,
                    Event.CTRL_MASK, true));
        }
        return saveMenuItem;
    }

    /**
     * This method initializes selectPort   
     *  
     * @return javax.swing.JMenu    
     */
    private JMenu getSelectPort() {
        String [] ports= null;
        ports = arduino.listPorts();

        if (selectPort == null) {
            selectPort = new JMenu();
            selectPort.setText("port");
            for (String a : ports){
                selectPort.add(getPortName(a));
            }
        }
        return selectPort;
    }

    /**
     * This method initializes portName 
     *  
     * @return javax.swing.JMenuItem    
     */

    private JMenuItem getPortName(String port) {
        if (portName == null) {
            portName = new JMenuItem();
            portName.setText(port);
            try {
                arduino.connect(port);
                worker.execute();
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        return portName;
    }

    /**
     * Launches this application
     */
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                GUI application = new GUI();
                application.getJFrame().setVisible(true);
            }
        });

    }

}
4

3 回答 3

2

done()仅被调用一次,当 SwingWorker 线程完成时,您应该从doInBackground()调用中更新您的标签。一种可能的方法是像这样实现PropertyChangeListener接口:

public class MainFrame extends javax.swing.JFrame implements PropertyChangeListener {

    private final JLabel label = new JLabel();

    MainFrame() {

        setPreferredSize(new Dimension(200, 200));
        add(label);
        pack();

        SwingWorker worker = new SwingWorker() {
            @Override
            protected Object doInBackground() throws Exception {
                String c = null;
                for (String s : new String[] {"a", "b", "c"}) {
                    Thread.sleep(1000);
                    firePropertyChange("counter", c, c = s);
                }
                return true;
            }
        };

        worker.addPropertyChangeListener(MainFrame.this);
        worker.execute();
    }

    public void propertyChange(PropertyChangeEvent evt) {
        if ("counter".equals(evt.getPropertyName())) {
            label.setText((String) evt.getNewValue());
        }
    }

    public static void main(String[] args) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new MainFrame().setVisible(true);
            }
        });
    }

}
于 2010-12-16T10:49:45.893 回答
1

process()如果要处理方法的中间结果,则需要覆盖SwingWorker 的doInBackground()方法。publish()您可以通过从 调用方法来发布中间结果doInBackground()

官方教程很好地解释了这一点。

于 2010-12-16T10:50:22.863 回答
0

我已经解决了

class ShowSense extends JLabel implements Runnable {
    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    private Thread th;
    public ShowSense(){
        th = new Thread(this);
        th.start();
    }
    @Override
    public void run() {
        // TODO Auto-generated method stub
        while (true){
        String sens = arduino.getSensor();
        this.setText(sens);
        }

    }

}
于 2010-12-20T07:37:28.113 回答