我有以下代码。我需要在结果变量更改时更新JTextPane对象。结果变量正确更改,已经过测试。此代码用作线程。我真的不知道如何解决它,也许任何eventlistener会很好吗?
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);
}
}
答案 0 :(得分:4)
您应该在update方法中调用JTextPane上的std::deque
,注意确保在Swing事件线程上调用它,例如,在使用{在事件线程上排队的Runnable中调用它{1}}。如,
setText(...)
但是你说它不起作用,你的代码说明了原因:你在上面的run方法中创建另一个 GeneralShopFrame对象,一个未显示的对象,因此,您正在向错误的 GeneralShopFrame对象通知对可观察对象的更改。不要这样做。而是可能将当前的GeneralShopFrame对象或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);
});
}