2016-08-12 62 views
1

我有以下代碼。當結果變量發生變化時,我需要更新JTextPane對象。結果變量正確更改,已經過測試。此代碼作爲線程工作。我真的不知道如何解決它,也許任何eventlistener會在那裏很好?線程JFrame需要更新JTextPane

public class GeneralShopFrame implements Runnable, Observer{ 
    private double result = 0 ; 
    JFrame jf = new JFrame(); 
    JPanel buttonPanel = new JPanel(); 
    JTextPane jtp = new JTextPane(); 
    @Override 
    public void run() { 
     String[] tab = { "Data_0.txt", "0" } ; 
     GeneralShopThread gst = new GeneralShopThread(tab); 
     Runnable r = gst; 
     Thread t = new Thread(r); 
     t.start(); 

     GeneralShopFrame gsf = new GeneralShopFrame(); 
     gst.addObserver(gsf);  

     jtp.setText("Current value of result is " + result); //I NEED UPDATE IT 

     buttonPanel.add(jtp); 

     buttonPanel.setPreferredSize(new Dimension(400, 200)); 

     jf.add(buttonPanel, BorderLayout.CENTER); 
     jf.pack(); 
     jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     jf.setVisible(true); 
    } 

    public GeneralShopFrame(String[] args) { 
    }  

    @Override 
    public void update(Observable o, Object arg) { 

     result = (double) arg; 
     System.out.println(makespan);  
    } 
} 

回答

4

你應該在JTextPane中調用setText(...)從更新方法中,照顧,以確保它是使用SwingUtilities.invokeLater(...)事件線程上排隊一個Runnable中調用Swing事件線程上,例如,從。例如,

// code not tested 
@Override 
public void update(Observable o, Object arg) { 
    SwingUtilities.invokeLater(() -> { 
     result = (double) arg; 
     jtp.setText("Current value of result is " + result); 
    }); 
} 

但你的狀態,它不工作,你的代碼說明了爲什麼:你上面的run方法中,一個不顯示內創建另一個 GeneralShopFrame對象,因爲這個,您正在通知錯誤 GeneralShopFrame對可觀察項的更改的對象。不要這樣做。相反,也許傳遞當前GeneralShopFrame對象或this到該呼叫:

gst.addObserver(this); 
+0

這是工作!謝謝!我失去了幾個小時來解決它.. – marylin17