我的应用程序发生了什么事情是有道理的,但我不知道如何解决它。以下是我的应用程序的简要说明:应在屏幕右下方显示一个计时器窗口并显示实时时间。一小时后,它应该做一些动作(我还没有决定行动)。我面临的问题是,在 Timer.java 中,当我刷新实时计时器的秒数时,我正在使用线程休眠,这阻止了我的所有应用程序继续执行,因此没有窗口正在展示。
这是我的代码和一些评论:
TimerFrame.java :应用程序的主框架
import java.awt.BorderLayout;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.Rectangle;
import javax.swing.JFrame;
public class TimerFrame extends JFrame{
public TimerFrame(String title) {
// TItle and Layout
super(title);
setLayout(new BorderLayout());
// Create the time panel and add it
final TimerPanel tp = new TimerPanel();
add(tp, BorderLayout.CENTER);
// Timer is a class I've created, and it fires an event every second
Timer time = new Timer();
time.addTimeListener(new TimeListener() {
public void refresh(String time) {
tp.setText(time);
}
});
// Configuration
setSize(300,300);
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice defaultScreen = ge.getDefaultScreenDevice();
Rectangle rect = defaultScreen.getDefaultConfiguration().getBounds();
int x = (int) rect.getMaxX() - getWidth();
int y = (int) rect.getMaxY() - getHeight();
this.setLocation(x, y);
setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
}
TimePanel.java :应在屏幕上显示实时时间的面板
import java.awt.Font;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class TimerPanel extends JPanel{
private JLabel label;
public TimerPanel() {
label = new JLabel("Start Time");
label.setFont(new Font("Arial",Font.BOLD,40));
add(label);
}
public void setText(String text){
label.setText(text);
}
}
TimerListener.java :监听器接口
public interface TimeListener {
public void refresh(String time);
}
Timer.java :提供实时时间,每秒触发一次名为刷新的事件。 在此calss中,thread.sleep()导致我的应用程序停止执行。
import java.text.SimpleDateFormat;
import java.util.Calendar;
public class Timer {
private TimeListener sl = null;
public Timer() {
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
boolean start = true;
int StartHour = 0;
while(true){
try {
// Get current time
Calendar cal = Calendar.getInstance();
// Initialize Start hour
if(start){
StartHour = getHour(cal, sdf);
start = false;
}
// Fire event
if(sl != null)
sl.refresh(sdf.format(cal.getTime()));
// If one hour
if(getHour(cal, sdf) - StartHour == 1){
// Code goes here
// Reset start
start = true;
}
// Delay 1 Sec
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
/**
* Get Current Hour
* @param cal Calentder
* @param sdf Date format
* @return Current Hour
*/
public static int getHour(Calendar cal, SimpleDateFormat sdf){
sdf.applyPattern("HH");
int hour = Integer.parseInt(sdf.format(cal.getTime()));
sdf.applyPattern("HH:mm:ss");
return hour;
}
/**
* Add Time Listener
* @param sl TimeListener
*/
public void addTimeListener(TimeListener sl){
this.sl = sl;
}
}
有没有人知道如何让我的应用程序执行,同时拥有一个无限运行的thread.sleep()?谢谢:))
答案 0 :(得分:2)