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

2024-05-09

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

这是我的代码和一些评论:
定时器框架.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);
    }
}

时间面板.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);
    }
}

定时器监听器.java:监听器接口

public interface TimeListener {
    public void refresh(String time);
}

定时器.java:给出生存时间,并每秒触发一个名为刷新的事件。在此调用中, 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() 的同时执行?谢谢 :)


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

不要使用 Thread.sleep()。

相反,使用摇摆计时器 http://docs.oracle.com/javase/tutorial/uiswing/misc/timer.html。您将计时器设置为每秒触发一次,以便可以更新组件。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

线程睡眠阻止我的 Swing 应用程序执行 的相关文章

随机推荐

  • 无法匹配任何路线。 URL 段:'':尝试使用子路由和 Ng2 时

    I have 以下笨蛋 https plnkr co edit PHaGNtfa0fPBgET4NEpZ p preview 这是行不通的 为了让它发挥作用 我可以评论 RouterModule forRoot path component
  • 显示带有 jQ​​uery-ui 自动完成功能的微调器

    我一直在到处搜索 但没有看到有人这样做 是否有可能拥有某种带有 jQ uery UI 自动完成功能的旋转器 加载器 1 8 获取数据时 我的解决方案是使用 ui autocomplete loading CSS 类 该类在 ajax GET
  • AngularUI Router:在调用子状态时将 url 参数传递给“抽象”状态

    我想在调用子状态时访问抽象状态内的 url 参数 stateParam 我很想知道如何做到这一点 代码在笨蛋也 http plnkr co edit L0TXx3DCBOJmh4XydXbV p preview stateProvider
  • 网页抓取 - 如何识别网页上的主要内容

    给定一个新闻文章网页 来自任何主要新闻来源 例如时报或彭博社 我想识别该页面上的主要文章内容 并丢弃其他杂项元素 例如广告 菜单 侧边栏 用户评论 在大多数主要新闻网站上都可以使用的通用方法是什么 有哪些好的数据挖掘工具或库 最好是基于Py
  • Phonegap 图像未显示

    我无法让图像在我的phonegap 版本中正常工作 我读过绝对路径可能不起作用 所以我尝试了绝对路径和相对路径 但仍然没有运气 我包括这样的图像
  • 什么是错误“类型实例化涉及 byref 类型。” F# 中的解决方法是什么

    我有一些代码包装 TA Lib 很多包装器非常相似 let sma timePeriod int data float let mutable outStartIndex 0 let mutable outNbElement 0 let m
  • Curl 和 Php 5.3.3 中的 SSL 连接错误

    我的网站自 3 年来一直运行良好 代码如下 现在突然从 2 天开始出现以下错误 SSL 连接错误 在 Curl error 中 下面是我的代码
  • 如何知道寄存器是否是“通用寄存器”?

    我试图了解寄存器必须具备什么标准才能被称为 通用寄存器 我相信通用寄存器是一个可以用于任何用途的寄存器 用于计算 将数据移入 移出等 并且是一个没有特殊用途的寄存器 现在我读到了ESP寄存器是通用寄存器 我猜是ESP寄存器可以用于任何事情
  • Ionic 2 获取离子输入值

    我正在使用 ionic 2 创建登录名 请不要只回答 您只需要添加 ngModules 属性 如果您认为这就是解决方案 请解释原因 解释一下 就像对孩子做的那样 我的代码在login ts import Component from ang
  • Android Windows:它们何时以及如何创建?

    我已经阅读了标准的 Windows 相关文档并翻阅了 一堆源代码 试图理解 Android 如何以及何时 窗口已创建 我相信我已经拥抱它并愿意 对其进行验证或更正 据我所知 只有两种方法可以获得 Window 对象的句柄 1 Activit
  • 在 ANTLR4 中如何检查行的第一个字符是否为“*”?

    我正在尝试为一种相对简单但特殊的语言编写一个解析器 简单地说 规则之一是注释行用星号表示only如果该星号是该行的第一个字符 我如何在 ANTLR4 中正式化这样的规则 我考虑过使用 START LINE COMMENT n n gt sk
  • HashSet 与 LinkedHashSet

    它们之间有什么区别 我知道 LinkedHashSet 是 HashSet 的有序版本 维护一个跨所有元素的双向链接列表 使用此类代替 HashSet 当您关心迭代顺序时 当你迭代 HashSet 时 顺序是不可预测的 而 LinkedHa
  • .NET JIT 编译的代码缓存在哪里?

    NET 程序首先被编译为 MSIL 代码 当它被执行时 JIT编译器会将其编译为本机机器代码 我想知道 这些JIT编译的机器代码存储在哪里 它只存储在进程的地址空间中吗 但由于程序的第二次启动比第一次快得多 我认为即使在执行完成后 该本机代
  • SVG 文本元素上的 CSS 转换在 Safari 中不起作用

    尝试在父 SVG 中放置电池指示器 SVG
  • SQL Server 2005 - 达到表行大小限制

    有没有一种干净的方法可以在向表添加新列之前确定表的行大小 并且不超过 8060 字节的限制 例如 如果表行长度当前为 8055 字节 并且我想添加日期时间 8 字节 则这将结束 因为它将变为 8063 字节 不包括空映射 但是 如果我添加一
  • Django CreateView:在验证之前设置用户

    我有一个模型 根据对象是由用户还是系统创建 对其名称字段使用不同的验证 class Symbol models Model name models CharField name unique True max length 64 creat
  • 使用(linq to sql)更新错误

    我有两个表 通过外键 CarrierID 绑定 Carrier CarrierID CarrierName CarrierID 1 CarrierName DHL CarrierID 2 CarrierName Fedex Vendor V
  • Spring Boot:在映射级别指定端口

    Spring Boot 我希望实现以下目标 一些 URL 路径映射到一个端口 一些映射到另一个端口 换句话说 我想要这样的东西 public class Controller1 RequestMapping value path1 port
  • 运行此 AVD 需要 HAXM

    我在 android studio 中创建了模拟器并在其中创建了一些应用程序 当我运行时 它给我一个错误 参见图 1 当我用谷歌搜索时 它告诉我你的系统不支持虚拟化 但我的系统支持它 参见图 2 现在我的问题是 当我的系统支持虚拟化时 为什
  • 线程睡眠阻止我的 Swing 应用程序执行

    我的应用程序发生的事情是有道理的 但我不知道如何修复它 以下是我的应用程序功能的简要描述 计时器窗口应显示在屏幕右下角并显示实时时间 一小时后 它应该执行一些操作 我还没有决定该操作 我面临的问题是定时器 java当我刷新实时计时器的秒数时