gpt4 book ai didi

Java SwingWorker 闪烁

转载 作者:行者123 更新时间:2023-12-04 04:44:20 30 4
gpt4 key购买 nike

有人能告诉我为什么在这个使用 SwingWorker 的简单演示中,屏幕闪烁,好像按钮不断跳跃一样? (关于改进多线程部分的反馈也值得赞赏)。

import java.awt.EventQueue;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Calendar;
import java.util.List;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingWorker;

public class SwingWorkerStopWatch extends JFrame{
JButton jbStart,jbStop;
JLabel jlStatus;
Long startTime;
SwingWorker<Double, Double> SW;

public SwingWorkerStopWatch() {
setLayout(new FlowLayout());
setSize(240, 100);

jlStatus = new JLabel("Press Start");

jbStart = new JButton("Start");
jbStop = new JButton("Stop");

jbStop.setEnabled(false);

jbStart.addActionListener(new ActionListener() {

@Override
public void actionPerformed(ActionEvent e) {
startTime = Calendar.getInstance().getTimeInMillis();
jbStart.setEnabled(false);
jbStop.setEnabled(true);
SW = new StopWatchSwingWorker();
SW.execute();
}
});

jbStop.addActionListener(new ActionListener() {

@Override
public void actionPerformed(ActionEvent e) {
SW.cancel(true);
Long stopTime = Calendar.getInstance().getTimeInMillis();
Double elapsedTime = (double)(stopTime-startTime)/1000;
jlStatus.setText("Elapsed time is: " + elapsedTime);
jbStart.setEnabled(true);
jbStop.setEnabled(false);
}
});

add(jbStart);
add(jbStop);
add(jlStatus);

//pack();
}

private class StopWatchSwingWorker extends SwingWorker<Double, Double>{

@Override
protected Double doInBackground() throws Exception {
Long tempTime;

while (true) {
tempTime = Calendar.getInstance().getTimeInMillis();
Double elapsedTime = (double)(tempTime-startTime)/1000;
publish(elapsedTime);
}
}

@Override
protected void process(List<Double> chunks) {
if (isCancelled()) {
return;
}
jlStatus.setText("" + chunks.get(chunks.size()-1));
}

}

public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {

@Override
public void run() {
JFrame stopWatchFrame = new SwingWorkerStopWatch();
stopWatchFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
stopWatchFrame.setVisible(true);
}
});
}
}

最佳答案

它与 SwingWorker 无关,而与您的组件如何响应其布局有关。如果数字字符串的尾随 0 导致 JLabel 改变宽度,导致跳跃,则数字字符串的宽度会发生变化,因此您应该使用 String.format(...) 格式化数字字符串,使其具有恒定的宽度。或 DecimalFormat 对象。

例如

例如,

  @Override
protected void process(List<Double> chunks) {
if (isCancelled()) {
return;
} else {
String numberTxt = String.format("%5.3f",
chunks.get(chunks.size() - 1));
jlStatus.setText(numberTxt);
}

// jlStatus.setText("" + chunks.get(chunks.size() - 1));
// System.out.println(chunks.get(chunks.size() - 1));
}

关于Java SwingWorker 闪烁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18421165/

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