小编典典

线程睡眠阻止了我的Swing应用程序执行

java

我的应用程序正在发生什么是有道理的,但我不知道如何解决。这是我的应用程序的简要说明:计时器窗​​口应显示在屏幕的右下角,并显示实时时间。一个小时后,它应该执行一些操作(我还没有决定要执行的操作)。我面临的问题是,在
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()的同时执行?谢谢 :)


阅读 248

收藏
2020-11-30

共1个答案

小编典典

有谁知道如何在有线程的情况下使我的应用程序执行。sleep()

不要使用Thread.sleep()。

而是使用Swing计时器。您将计时器设置为每秒触发一次,以便可以更新组件。

2020-11-30