所以我开始对Threads以及它是如何工作感兴趣的,有点惊人它是如何工作的但是我今天刚刚了解它并尝试使程序工作。所以我试着制作一个时钟,让我在Jlabel中提供现在的时钟,以及我自己输入时间的Textfield。所以我想要的是它应该首先向我展示时间,当按下“设定时间”按钮时,它应该改变我进入的时间并从那里作为时钟。
所以我现在的问题是,每当我按下设定时间时,它会改变一秒,然后再次转回当前时钟。当按下设定时间(开始第二个线程)时,我真的不知道如何停止第一个线程
但是我认为这有点简单但很有趣,
编辑:我还发现在输入自己的“时钟”时我会有一个问题。我的代码:
public Clock() {
initialize();
Thread1();
}
.......
JButton btnSetTime = new JButton("Set time");
btnSetTime.setBounds(474, 262, 89, 23);
frame.getContentPane().add(btnSetTime);
btnSetTime.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if(e.getSource() == btnSetTime) {
Thread2();
}
}
});
}
public void Thread2() {
Thread t2 = new Thread() {
public void run() {
try {
for(;;) {
int hour = Integer.parseInt(tfhour.getText());
int minute = Integer.parseInt(tfminute.getText());
int second = Integer.parseInt(tfsecond.getText());
lblKlockan.setText(hour + ":" + minute + ":" + second);
sleep(1000);
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
};t2.start();
}
public void Thread1() {
Thread t1 = new Thread() {
public void run() {
try {
for(;;) {
Calendar cal = Calendar.getInstance();
int hour = cal.get(Calendar.HOUR_OF_DAY);
int minute = cal.get(Calendar.MINUTE);
int second = cal.get(Calendar.SECOND);
lblKlockan.setText(hour + ":" + minute + ":" + second);
sleep(1000);
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
};t1.start();
}
}
我可以看到,int hour = Integer.parseInt(tfhour.getText());如果我以后换到自己的时钟,如果我是对的,可能不会算作时钟吗?在那种情况下,我该如何解决?
我希望我在帖子中有我所有的问题,我希望这里的任何人都愿意帮助我以及:)
编辑:
答案 0 :(得分:1)
当线程2启动时,您必须定义一个全局变量来停止线程1。这是一个例子,
//define a variable that controls the thread 1
static boolean clockSet = false;
现在写入线程1,例如它仅在clockSet为false时运行,即时钟未通过单击设置。
Thread t1 = new Thread(){
public void run(){
while(!clockSet){
Calendar cal = Calendar.getInstance();
int hour = cal.get(Calendar.HOUR_OF_DAY);
int minute = cal.get(Calendar.MINUTE);
int second = cal.get(Calendar.SECOND);
lblKlockan.setText(hour + ":" + minute + ":" + second);
try {
sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
};
在你的线程2中,将clockSet设置为true,所以线程1将停止。我看到你只是显示输入的值,但没有在Calendar对象上设置它们。因此,在线程2中创建一个Calendar对象,设置用户定义的值,并在每次睡眠后增加时间。
Thread t2 = new Thread(){
public void run(){
clockSet = true;
Calendar cal = Calendar.getInstance();
cal.set(Calendar.HOUR_OF_DAY, Integer.parseInt(tfhour.getText()));
cal.set(Calendar.MINUTE, Integer.parseInt(tfminute.getText()));
cal.set(Calendar.SECOND, Integer.parseInt(tfsecond.getText()));
while(true){
int hour = cal.get(Calendar.HOUR_OF_DAY);
int minute = cal.get(Calendar.MINUTE);
int second = cal.get(Calendar.SECOND);
lblKlockan.setText(hour + ":" + minute + ":" + second);
try {
sleep(1000);
cal.add(Calendar.SECOND, 1);
} catch (InterruptedException e) {
e.printStackTrace();}
}
}
};
玩得开心..!
答案 1 :(得分:0)
当然,你看到了代码
try {
for(;;) {
int hour = Integer.parseInt(tfhour.getText());//this one
int minute = Integer.parseInt(tfminute.getText());//and this one
int second = Integer.parseInt(tfsecond.getText());//and this too
lblKlockan.setText(hour + ":" + minute + ":" + second);
sleep(1000);
}
你正在设置小时,分钟和时间在for循环中每次都是第二次。所以时钟正在重置。
让它们只进行一次初始化,即将它们从循环中取出。
此外代码
for(;;) {
Calendar cal = Calendar.getInstance();
int hour = cal.get(Calendar.HOUR_OF_DAY);
int minute = cal.get(Calendar.MINUTE);
int second = cal.get(Calendar.SECOND);
lblKlockan.setText(hour + ":" + minute + ":" + second);
sleep(1000);
}
让您的计时器作为时钟工作,而不是计时器,因为1秒后。小时,分钟和第二个根据您从日历中获得的时间设置为值。
因此,您的代码将作为显示当前时间的时钟。
答案 2 :(得分:0)
在我看来,你根本不需要第二个线程。在这种情况下我要做的是创建三个Int
字段,小时,分钟和秒偏移,按下按钮时可以更改,例如hourOffset = Calendar.HOUR_OF_DAY - Integer.parseInt(tfhour.getText())%24;
(小时示例) )。你只需要在thread1中添加偏移量,因为从0开始作为偏移量,它始终有效。