我的应用程序正在发生什么是有道理的,但我不知道如何解决。这是我的应用程序的简要说明:计时器窗口应显示在屏幕的右下角,并显示实时时间。一个小时后,它应该执行一些操作(我还没有决定要执行的操作)。我面临的问题是,在 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 :提供实时时间,并每秒触发一次名为refresh的事件。 在这种情况下,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()的同时执行?谢谢 :)
有谁知道如何在有线程的情况下使我的应用程序执行。sleep()
不要使用Thread.sleep()。
而是使用Swing计时器。您将计时器设置为每秒触发一次,以便可以更新组件。