【问题标题】:Thread JFrame needs to update JTextPane线程 JFrame 需要更新 JTextPane
【发布时间】:2016-08-12 15:51:33
【问题描述】:

我有以下代码。当结果变量发生变化时,我需要更新 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);    
    }
}

【问题讨论】:

    标签: java multithreading swing jframe jtextpane


    【解决方案1】:

    您应该从 update 方法中调用 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 方法中创建 another GeneralShopFrame 对象,该对象未显示,因此,您正在通知 错误 GeneralShopFrame 对象对可观察对象的更改。不要这样做。相反,也许将当前的 GeneralShopFrame 对象或 this 传递到此调用中:

    gst.addObserver(this);  
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多