【问题标题】:Thread sleep prevents my Swing application from executing线程睡眠阻止我的 Swing 应用程序执行
【发布时间】:2014-05-21 17:50:50
【问题描述】:

我的应用程序发生的事情是有道理的,但我不知道如何解决它。下面是我的应用程序的简要说明: 一个计时器窗口应该显示在我的屏幕右下方并显示实时时间。一个小时后,它应该做一些动作(我还没有决定动作)。我面临的问题是,在 Timer.java 中,当我刷新实时计时器的秒数时,我正在使用线程睡眠,这会阻止我的所有应用程序继续执行,因此没有窗口正在显示。

这是我的一些 cmets 代码:
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 的事件。 在这个 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() 的同时执行?谢谢你:)

【问题讨论】:

    标签: java swing timer


    【解决方案1】:

    有谁知道如何让我的应用程序在使用 thread.sleep() 时执行

    不要使用 Thread.sleep()。

    改为使用Swing Timer。您将 Timer 设置为每秒触发一次,以便更新组件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-28
      • 1970-01-01
      • 2021-05-05
      • 2015-03-18
      • 2017-01-21
      • 1970-01-01
      相关资源
      最近更新 更多