2016-08-12 53 views
1

次のコードがあります。結果変数が変更されたときにJTextPaneオブジェクトを更新する必要があります。結果変数が正しく変更され、テストされます。このコードはスレッドとして機能します。私は本当にどのようにそれを解決するためのアイデアを持っていない、多分任意のeventlistenerはそこに良いだろうか?あなたはSwingUtilities.invokeLater(...)を使用してイベントスレッドにキューイングされているのRunnableの中から、例えば、それはSwingのイベントスレッド上で呼び出されたことを確認するために世話をして、更新方法の中からJTextPaneの上setText(...)を呼び出す必要がありスレッド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

。例えば、

// 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メソッド、1以内 GeneralShopFrameオブジェクトを作成しています ObservableのGeneralShopFrameオブジェクトに間違っていることを通知しています。これをしないでください。代わりに、現在のGeneralShopFrameオブジェクトまたはthisをこの呼び出しに渡します。

gst.addObserver(this); 
+0

ありがとうございました!私はそれを解決するために数時間を失った.. – marylin17

関連する問題