gpt4 book ai didi

java - 线程 JFrame 需要更新 JTextPane

转载 作者:行者123 更新时间:2023-11-29 08:42:52 27 4
gpt4 key购买 nike

我有以下代码。结果变量更改时,我需要更新 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 事件线程上调用的,例如,从一个 Runnable 中调用使用 SwingUtilities.invokeLater(...) 在事件线程中排队。例如,

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

但是您声明它不起作用,并且您的代码说明了原因:您正在上面的运行方法中创建另一个 GeneralShopFrame 对象,该对象未显示,因此,您正在通知错误 GeneralShopFrame 对象关于可观察对象的更改。不要这样做。相反,也许将当前的 GeneralShopFrame 对象或 this 传递到此调用中:

gst.addObserver(this);  

关于java - 线程 JFrame 需要更新 JTextPane,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38921969/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com