Java 如何使用计时器创建时钟?

Java 如何使用计时器创建时钟?,java,swing,timer,Java,Swing,Timer,我正在尝试创建一个七段显示,通过使用ActionListener和actionPerformed,使用计时器自动移动 我认为如果我使用for,if语句,它会自动从0循环到2,并为每个数字段设置背景色。但是,当我显示它时,它被卡在只显示零的位置上,并且不会从零开始计数 有谁能帮我弄清楚我做错了什么,这让我陷入了困境 下面是我现在使用JFrame进行的编程 导入javax.swing.Timer; 公共类SevenSegment扩展了JFrame{ 定时器=新定时器(100,空); 公共服务{ ti

我正在尝试创建一个七段显示,通过使用ActionListener和actionPerformed,使用计时器自动移动

我认为如果我使用for,if语句,它会自动从0循环到2,并为每个数字段设置背景色。但是,当我显示它时,它被卡在只显示零的位置上,并且不会从零开始计数

有谁能帮我弄清楚我做错了什么,这让我陷入了困境

下面是我现在使用JFrame进行的编程

导入javax.swing.Timer;
公共类SevenSegment扩展了JFrame{
定时器=新定时器(100,空);
公共服务{
timer.start();
timer.addActionListener(新ActionListener(){
已执行的公共无效操作(操作事件e){
对于(int i=0;i<3;i++){
如果(i==0){
LBL编号。立根背景(颜色。红色);
LBL编号2.立根背景(颜色:红色);
LBLnNumber 3.后坐地面(颜色:红色);
LBLn4号。挫折地面(颜色。红色);
LBLnNumber 5.立根背景(颜色:红色);
LBLn6号。挫折地面(颜色。红色);
}
else如果(i==1){
LBL编号2.立根背景(颜色:红色);
LBLnNumber 3.后坐地面(颜色:红色);
}
else如果(i==2){
LBL编号。立根背景(颜色。红色);
LBL编号2.立根背景(颜色:红色);
}
}
} 
});
}
}

这是一个尽可能简单的Swing GUI时钟

我这样做是为了向您展示启动所有Swing GUI的一般方法。Oracle有一个有用的教程,它将向您展示如何创建各种Swing GUI

我们通过调用
SwingUtilities
invokeLater
方法来启动所有Swing GUI。此方法确保在上创建并执行所有Swing组件

我们总是创建一个
JPanel
来安装Swing组件。我们添加到
JFrame
的唯一Swing组件是
JPanel
JScrollPane
。这允许我们将
JFrame
的创建与视图的其余部分分开。对于所有Swing应用程序,
JFrame
代码几乎相同。唯一的区别是添加到
JFrame
中的
JPanels

必须按特定顺序调用
JFrame
代码。这是我在Swing应用程序中使用的顺序

JPanel
代码在一个单独的段落中,用于总体整洁。我喜欢将事情分开,以便一次只关注GUI的一小部分

之所以存在
updateLockLabel
方法,是因为我需要在创建
JPanel
时执行一次代码,然后每秒执行五次,以实际更新
JLabel

顺便说一句,我并不是一次编写所有这些代码(全部64行)。我写了一点,测试了很多。我的代码在我第一次写的时候是不正确的,我不仅仅是指拼写错误

下面是完整的可运行代码

import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;

import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.Timer;

public class SimpleClock implements Runnable {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new SimpleClock());
    }
    
    private JLabel clockLabel;

    @Override
    public void run() {
        JFrame frame = new JFrame("Clock");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        frame.add(createMainPanel(), BorderLayout.CENTER);
        
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
        
        Timer timer = new Timer(200, new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent event) {
                updateClockLabel();
            }
        });
        timer.start();
    }
    
    private JPanel createMainPanel() {
        JPanel panel = new JPanel(new FlowLayout());
        panel.setBorder(BorderFactory.createEmptyBorder(5, 45, 5, 45));
        
        clockLabel = new JLabel(" ");
        clockLabel.setFont(panel.getFont().deriveFont(Font.BOLD, 72f));
        updateClockLabel();
        panel.add(clockLabel);
        
        return panel;
    }
    
    public void updateClockLabel() {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("H:mm:ss a");
        String timeDisplay = LocalTime.now().format(formatter);
        clockLabel.setText(timeDisplay);
    }

}

i==0
后所有背景为红色;然后在
i==1
中,将两个设置为红色-其余的保持红色。所以不确定你在期待什么;似乎每次都需要
setBackground
查看所有标签的变化。你好,安迪,现在我明白了。非常感谢。“(使用Java和Eclipse)”不需要在标题中提及任何主要标记。除非代码在另一个IDE中工作,否则没有必要提及IDE。您在Timer ActionListener的一次迭代中完成了所有工作。你一次只做一件事,我