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