[英]Java SwingWorker Flicker
有人可以告訴我為什么在這個使用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無關,與組件如何響應其布局無關。 如果數字String的尾部為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));
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.