0
我正在嘗試創建秒錶。 開始和暫停按鈕工作正常,但取消暫停按鈕無法正常工作。 定時器是我的JLabel,其中我想要示範我的秒錶(它從JFrame引用定時器)。我無法發佈MCVE,因爲它代碼太多。秒錶取消暫停不起作用
這裏是我的秒錶類:
public class Stopwatch extends Thread {
private boolean finishedFlag = false;
private boolean pauseFlag = false;
private boolean sortFlag = false;
private long summedTime = 0;
private JLabel timer;
public Stopwatch(){}
public Stopwatch(boolean finished, boolean pause, boolean sort, JLabel timer){
this.finishedFlag = finished;
this.pauseFlag = pause;
this.sortFlag = sort;
this.timer = timer;
}
@Override
public void run() {
long startTime = System.currentTimeMillis();
while(sortFlag && !pauseFlag && !finishedFlag) {
update(summedTime + (System.currentTimeMillis() - startTime));
}
if(pauseFlag)
summedTime += System.currentTimeMillis() - startTime;
else
summedTime = 0;
}
private void update(long dT){
long x = (dT/1000)%60;
long y = (dT/60000)%1000;
if(x>=0 && x<=9 && y>=0 && y<=9)
timer.setText("0"+String.valueOf((dT/60000)%1000)+":0"+String.valueOf((dT/1000)%60)+","+String.valueOf((dT)%1000));
else if(x>9 && y>=0 && y<=9)
timer.setText("0"+String.valueOf((dT/60000)%1000)+":"+String.valueOf((dT/1000)%60)+","+String.valueOf((dT)%1000));
else if(x>=0 && x<=9 && y>9)
timer.setText(String.valueOf((dT/60000)%1000)+":0"+String.valueOf((dT/1000)%60)+","+String.valueOf((dT)%1000));
else if(x>9 && y>9)
timer.setText(String.valueOf((dT/60000)%1000)+":"+String.valueOf((dT/1000)%60)+","+String.valueOf((dT)%1000));
}
}
這是我用我的按鈕聽衆:
ActionListener sortListener = new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
if(sortFlag == false && pauseFlag == false)
{
sortFlag = true;
System.out.println("sort");
stopwatch1 = new Stopwatch(finishedFlag,pauseFlag,sortFlag,timer1);
stopwatch1.start();
appFrame.validate();
appFrame.repaint();
}
}
};
sortButton.addActionListener(sortListener);
ActionListener pauseListener = new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
if(sortFlag && pauseFlag == false)
{
pauseFlag = true;
timeSpent = stopwatch1.getSummedTime();
stopwatch1.setPauseFlag(true);
System.out.println("pause");
}
}
};
pauseButton.addActionListener(pauseListener);
ActionListener unpauseListener = new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
if(sortFlag && pauseFlag)
{
pauseFlag = false;
stopwatch1.setPauseFlag(false);
stopwatch1.run();
System.out.println("unpause");
}
}
};
unpauseButton.addActionListener(unpauseListener);
您需要在您的主循環中放置一個監視器鎖 – MadProgrammer
您是指在run()方法的while循環中?單擊暫停按鈕時將其鎖定並在單擊取消暫停按鈕時將其解鎖? – Andrew