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