线程JFrame需要更新JTextPane



我有以下代码。我需要更新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);    
    }
}

你应该从更新方法中调用JTextPane上的setText(...),注意确保它是在Swing事件线程上调用的,例如,从使用SwingUtilities.invokeLater(...)在事件线程上排队的Runnable中调用。例如,

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

最新更新