我正在尝试建立一个国际象棋时钟来学习,我仍然坚持使用下面的代码。我会像这样使用actionListener。什么时候"怀特"按下按钮,blackTime将每秒递减一次,当" Black"按下按钮whiteTime将每秒递减一次。
现在我的问题是找到一种减少每秒时间的方法。我看到了一些这样的问题,他们谈到了Timer类。我从来没有使用它,我的理解是它需要一个ActionListener。我已经使用了一个,所以我会以某种方式添加另一个或者有更简单的方法吗?
谢谢!
public class ChessClock extends JFrame implements ActionListener {
JPanel p;
JButton b1,b2;
JLabel l1;
public ChessClock(){
super();
this.setVisible(true);
this.setSize(600,400);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
int whiteTime = 59;
int blackTime = 59;
p = new JPanel(new GridBagLayout());
b1 = new JButton("White");
b2 = new JButton("Black");
l1 = new JLabel("00:" + whiteTime + " - " + "00:" + blackTime, SwingConstants.CENTER);
l1.setFont(new Font("Serif", Font.PLAIN, 85));
b1.setPreferredSize(new Dimension(200,100));
b2.setPreferredSize(new Dimension(200,100));
b1.addActionListener(this);
b2.addActionListener(this);
GridBagConstraints c = new GridBagConstraints();
c.insets = new Insets(40,40,40,40);
p.add(b1,c);
p.add(b2,c);
this.add(p, BorderLayout.SOUTH);
this.add(l1, BorderLayout.CENTER);
}
public void actionPerformed(ActionEvent e){ //will later be used to switch between whiteTime - blackTime
String s = e.getActionCommand();
if(s == "White")
s = s;
if(s == "Black")
s = s;
}
}
答案 0 :(得分:1)
来自Java Docs,
int delay = 1000; //milliseconds
ActionListener taskPerformer = new ActionListener() {
public void actionPerformed(ActionEvent evt) {
if(blackTurn)
black--;
else if(whiteTurn)
white--;
}
};
new Timer(delay, taskPerformer).start();
我认为一般来说你应该避免使用Thread.sleep()
并使用内置的计时器类!使用Thread.sleep()
的while循环将保持线程并等待,而计时器则不会。
是的,创建另一个动作!
答案 1 :(得分:0)
如何:
While(condition){
Thread.sleep(1000);
if(//White button pressed){
blackTime--;
}else{
whiteTime--;
}
在执行下面的代码之前会等待1秒。