gpt4 book ai didi

java - 使用 ThermometerPlot 类时,如何看到 Mercurial 的转变?

转载 作者:行者123 更新时间:2023-12-01 14:14:27 24 4
gpt4 key购买 nike

我正在使用 JFreeChart 编写一个温度计,但我不想看到它只显示一个值...我需要将最终值放入 JTextField 中(然后按一个按钮)并查看 Mercurial 的变化情况从 0° 到最终值,我想看看 Mercurial 是如何上升的。

我用 Thread.sleep(500) 创建了一个 FOR(从 0 到最终值),然后使用 FOR 中的索引更新数据集值,但它没有显示转换,它完成 FOR 并最终返回显示最终值的温度计。我尝试刷新图表,但没有成功。

我的按钮中的代码

final JButton btnAccept = new JButton("Accept");
btnAceptar.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
for(int i = 0; i <= 40; i++) {
try {
Thread.sleep(500);
}
catch(InterruptedException ex) {
Thread.currentThread().interrupt();
}
dataset.setValue(i);
}
}
});
panel.add(btnAceptar);

最佳答案

Swing 是一个单线程框架。也就是说,对 UI 的所有交互和修改都应该从事件调度线程的内容中执行。

任何阻塞该线程的操作都会阻止 EDT 开始处理重绘请求和处理新事件(除其他外)。

这里遇到的问题是 actionPerformed 事件是从 EDT 上下文中触发的。您的 for-next 循环现在正在阻止 EDT,从而阻止处理任何绘制请求...

你可以...

使用javax.swing.Timer定期触发事件并更新数据集值,直到达到所需目标,然后停止计时器。

例如...

final JButton btnAccept = new JButton("Accept");
btnAceptar.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
dataset.setValue(0);
Timer timer = new Timer(500, new ActionListener() {
public void actionPerformed(ActionEvent evt) {
int current = dataset.getValue();
if (current < 40) {
current++;
dataset.setValue(current);
} else {
((Timer)evt.getSource()).stop();
}
}
});
timer.start();
}
});
panel.add(btnAceptar);

你可以...

使用 SwingWorker,它在其 doInBackground 方法中使用 for-next 循环,发布新值,该值将可供它是 process 方法,在 EDT 的上下文中执行...

例如...

final JButton btnAccept = new JButton("Accept");
btnAceptar.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
SwingWorker worker = new SwingWorker<Object, Integer> {
protected Object doInBackground() {
for(int i = 0; i <= 40; i++) {
try {
Thread.sleep(500);
}
catch(InterruptedException ex) {
break;
}
publish(i);
}
}

protected void process(List<Integer> chunks) {
// Only care about the last update...
dataset.setValue(chunks.get(chunks.size() - 1));
}
}
}
});
panel.add(btnAceptar);

你可以...

滚动您自己的Thread,它将在run方法中使用for-next循环,但您必须使用SwingUtilities.invokeLater 在 EDT 上下文中更新数据集,这很困惑且麻烦,尤其是使用其他两个选项时...

查看Concurrency in Swing了解更多详情

关于java - 使用 ThermometerPlot 类时,如何看到 Mercurial 的转变?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18244315/

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