📅  最后修改于: 2023-12-03 15:06:52.449000             🧑  作者: Mango
本文将介绍如何使用Java Swing组件来实现一个交通信号的程序。
交通信号是道路交通中非常重要的一个交通标志,它可以控制车辆的行驶方向和速度,确保交通的顺利进行。在本文中,我们将实现一个能够自动控制不同颜色的交通信号的程序。
首先,我们需要创建一个Java项目,并引入Swing组件库。然后,在项目中创建一个继承自JFrame的主窗体类MainWin,实现程序的主要逻辑。
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class MainWin extends JFrame implements ActionListener {
private int currLight = 0; // 记录当前交通信号的颜色
private JPanel lightPanel; // 用来显示交通信号的面板
private JLabel label; // 显示当前交通信号的标签
private JButton button; // 用来控制交通信号的按钮
private Timer timer; // 定时器,用来每隔一定时间改变交通信号的颜色
// 界面初始化
public MainWin() {
super("交通信号");
setSize(200, 300);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 创建面板
lightPanel = new JPanel();
lightPanel.setBackground(Color.GRAY);
add(lightPanel, BorderLayout.CENTER);
// 创建标签
label = new JLabel();
label.setForeground(Color.WHITE);
label.setHorizontalAlignment(SwingConstants.CENTER);
lightPanel.add(label);
// 创建按钮
button = new JButton("启动");
button.addActionListener(this);
add(button, BorderLayout.SOUTH);
timer = new Timer(2000, this); // 创建定时器,每隔2秒钟改变信号颜色
timer.setInitialDelay(0);
}
// 事件处理
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource() == button) { // 如果点击了按钮
if (timer.isRunning()) { // 如果定时器正在运行
timer.stop(); // 停止定时器
button.setText("启动");
} else { // 如果定时器没有运行
timer.start(); // 启动定时器
button.setText("停止");
}
} else { // 如果是定时器触发的事件
currLight = (currLight + 1) % 3; // 改变交通信号的颜色
switch (currLight) {
case 0:
label.setText("红灯亮");
lightPanel.setBackground(Color.RED);
break;
case 1:
label.setText("黄灯亮");
lightPanel.setBackground(Color.YELLOW);
break;
case 2:
label.setText("绿灯亮");
lightPanel.setBackground(Color.GREEN);
break;
default:
break;
}
}
}
// 程序入口
public static void main(String[] args) {
MainWin win = new MainWin();
win.setVisible(true);
}
}
上述代码中,我们定义了一个主窗体类MainWin,该类继承自JFrame,并实现了ActionListener接口。在类中,我们定义了一个用来记录当前交通信号颜色的变量currLight,一个用来显示交通信号的面板lightPanel,一个用来显示当前交通信号的标签label,一个用来控制交通信号的按钮button,以及一个用来定时改变交通信号颜色的定时器timer。
在界面初始化时,我们创建了一个显示交通信号的面板lightPanel,并将其添加到主窗体中。在面板上,我们创建了一个显示当前交通信号的标签label,并设置其水平居中显示。最后,我们创建了一个控制交通信号的按钮button,并将其添加到主窗体中。
在按钮的事件处理方法中,我们判断当前事件是否来自于按钮,如果是,则根据当前定时器的运行状态来决定是否启动或停止定时器,并修改按钮的文本。如果当前事件不是来自按钮,则说明是定时器触发的事件,此时我们根据记录的当前交通信号颜色变量currLight来改变交通信号颜色,并更新标签和面板的内容。
在程序入口main方法中,我们创建了一个MainWin对象,并将其设置为可见状态。
程序运行效果如下图所示:
完整的源代码如下所示:
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class MainWin extends JFrame implements ActionListener {
private int currLight = 0; // 记录当前交通信号的颜色
private JPanel lightPanel; // 用来显示交通信号的面板
private JLabel label; // 显示当前交通信号的标签
private JButton button; // 用来控制交通信号的按钮
private Timer timer; // 定时器,用来每隔一定时间改变交通信号的颜色
// 界面初始化
public MainWin() {
super("交通信号");
setSize(200, 300);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 创建面板
lightPanel = new JPanel();
lightPanel.setBackground(Color.GRAY);
add(lightPanel, BorderLayout.CENTER);
// 创建标签
label = new JLabel();
label.setForeground(Color.WHITE);
label.setHorizontalAlignment(SwingConstants.CENTER);
lightPanel.add(label);
// 创建按钮
button = new JButton("启动");
button.addActionListener(this);
add(button, BorderLayout.SOUTH);
timer = new Timer(2000, this); // 创建定时器,每隔2秒钟改变信号颜色
timer.setInitialDelay(0);
}
// 事件处理
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource() == button) { // 如果点击了按钮
if (timer.isRunning()) { // 如果定时器正在运行
timer.stop(); // 停止定时器
button.setText("启动");
} else { // 如果定时器没有运行
timer.start(); // 启动定时器
button.setText("停止");
}
} else { // 如果是定时器触发的事件
currLight = (currLight + 1) % 3; // 改变交通信号的颜色
switch (currLight) {
case 0:
label.setText("红灯亮");
lightPanel.setBackground(Color.RED);
break;
case 1:
label.setText("黄灯亮");
lightPanel.setBackground(Color.YELLOW);
break;
case 2:
label.setText("绿灯亮");
lightPanel.setBackground(Color.GREEN);
break;
default:
break;
}
}
}
// 程序入口
public static void main(String[] args) {
MainWin win = new MainWin();
win.setVisible(true);
}
}
本文介绍了如何使用Java Swing组件来实现一个交通信号的程序。通过本文的学习,读者可以掌握Java Swing的基本使用方法,并了解到如何使用定时器来实现周期性任务。希望本文对大家的学习有所帮助。