2010-12-16 19 views
0

我試過swingwoker,但將只更新一次...... http://piggyman007.blogspot.com/2010/04/java-swingworker-multithread.html如何從Class方法重複創建Jlabel addText?

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

    } 

} 
+2

考慮公開代碼 – 2010-12-16 10:18:47

回答

2

()完成被調用一次,當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); 
      } 
     }); 
    } 

} 
+0

的SwingWorker自帶發佈()和過程()方法,您可以覆蓋到做同樣的,你通過的propertyChange實現什麼()解決。 – Kintaro 2010-12-16 10:53:15

+1

我通常會跟蹤SwingWorker.StateValue來準備/結束ui(因此無論如何都需要監聽器);積極的一面是,ui更新代碼保存在一個地方,你可以免費獲得「進度」:) – 2010-12-16 11:22:06

+0

這種方法更好嗎? http://www.java2s.com/Code/Java/Threads/UsingtheRunnableinterface.htm – wizztjh 2010-12-20 07:18:06

1

你需要重寫的SwingWorker的process()方法,如果要處理來自doInBackground()方法的中間結果。您可以通過從doInBackground()調用publish()方法來發布中間結果。

official tutorial解釋得很好。

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

    } 

} 
+1

你最好使用Swing's * Timer *來間隔輪詢你的傳感器(或者* Timer * + * SwingWorker *如果* getSensor()*可能需要一些時間);你會在這裏找到一個例子:http://download.oracle.com/javase/tutorial/uiswing/misc/timer.html – 2010-12-20 08:42:08