所以我开始对线程和它的工作方式产生真正的兴趣,Kinda令人惊叹它是如何工作的,但我今天才了解到它,并试图使一个程序工作起来。所以我试着做一个时钟,给我一个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());可能不会算作时钟,如果我是正确的话?那样的话,我该怎么解决呢?
我希望我的所有问题都在这里,我希望在座的任何人也愿意帮助我:)
编辑:
使人更容易看到:

编辑第3部分:0

发布于 2015-11-10 19:07:57
当线程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();}
}
}
};玩得开心..!
发布于 2015-11-10 18:38:01
当然,你看到密码了
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秒后。“小时”、“分钟”和“秒”根据从日历获得的时间设置为值。
因此,您的代码将作为显示当前时间的时钟工作。
发布于 2015-11-10 18:59:35
在我看来,你根本不需要第二条线。在本例中,我要做的是创建三个Int字段,小时、分钟和秒偏移量,当按钮按到hourOffset = Calendar.HOUR_OF_DAY - Integer.parseInt(tfhour.getText())%24; (例如小时)时,您可以更改这些字段。您只需要将偏移量添加到thread1中的时间中,因为从0作为偏移量开始时,这一切都是有效的。
https://stackoverflow.com/questions/33636812
复制相似问题