📜  使用Java Swing 组件实现交通信号(1)

📅  最后修改于: 2023-12-03 15:06:52.449000             🧑  作者: Mango

使用Java Swing 组件实现交通信号

本文将介绍如何使用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的基本使用方法,并了解到如何使用定时器来实现周期性任务。希望本文对大家的学习有所帮助。