作业四:灯泡异常问题

一波大作业临近~图像处理~网管。。赶了一晚上把这个写出来了~

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Bulb extends JFrame {
    private final int INTER_SECOND = 500; // 间隔时间
    private BulbButton b1 = new BulbButton("B1");
    private BulbButton b2 = new BulbButton("B2");
    private BulbButton b3 = new BulbButton("B3");
    private BulbButton b4 = new BulbButton("B4");
    private BulbLight l1 = new BulbLight(1);
    private BulbLight l2 = new BulbLight(2);
    private JButton bb1 = new BuldStateButton(l1);
    private JButton bb2 = new BuldStateButton(l2);
    private JLabel state = new JLabel("关闭");
    private CheckLightThread thread;

    public Bulb() {
        this.setTitle("灯泡模拟");
        this.setSize(300, 200);
        this.setLayout(new GridLayout(4, 1));
        this.add(new JPanel() {
            {
                this.setLayout(new FlowLayout(FlowLayout.CENTER));
                this.add(new JLabel("电源状态:"));
                this.add(state);
            }
        });
        this.add(new JPanel() {
            {
                this.setLayout(new FlowLayout(FlowLayout.CENTER));
                this.add(l1);
                this.add(l2);
            }
        });
        this.add(new JPanel() {
            {
                this.setLayout(new FlowLayout(FlowLayout.CENTER));
                this.add(b1);
                this.add(b2);
                this.add(b3);
                this.add(b4);
            }
        });
        this.add(new JPanel() {
            {
                this.setLayout(new FlowLayout(FlowLayout.CENTER));
                this.add(bb1);
                this.add(bb2);
            }
        });
        setButtons();
        this.setVisible(true);
    }

    private void setButtons() {
        b2.setEnabled(false);
        b3.setEnabled(false);
        b4.setSelected(true);
        b1.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                b1.changeState();
                if (b1.isSelected()) {
                    b4.setSelected(false);
                    b2.setEnabled(true);
                    b3.setEnabled(true);
                } else {
                    b2.setSelected(false);
                    b3.setSelected(false);
                    b4.setSelected(true);
                    b2.setEnabled(false);
                    b3.setEnabled(false);
                }
                changeSystemState();
            }
        });
        b2.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                if (!b1.isSelected() && b4.isSelected())
                    return; // 在电源关闭状态下,B2和B3按钮不起作用
                b2.changeState();
                if (b2.getCount() > b3.getCount()) { // 如果B2被按下的次数比B3被按下的次数多,L1亮
                    l1.change(true);
                    l2.change(false);
                }
            }
        });
        b3.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                if (!b1.isSelected() && b4.isSelected())
                    return; // 在电源关闭状态下,B2和B3按钮不起作用
                b3.changeState();
                if (b3.getCount() >= b2.getCount()) { // 如果B2被按下的次数比B3被按下的次数少,L2亮
                    l1.change(false);
                    l2.change(true);
                }
            }
        });
        b4.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                b4.changeState();
                if (b4.isSelected()) {
                    b1.setSelected(false);
                    b2.setSelected(false);
                    b3.setSelected(false);
                    b2.setEnabled(false);
                    b3.setEnabled(false);
                } else {
                    b1.setSelected(true);
                    b2.setEnabled(true);
                    b3.setEnabled(true);
                }
                changeSystemState();
            }
        });
    }

    private void changeSystemState() {
        if (!b1.isSelected() && b4.isSelected()) { // 在电源关闭状态下,灯应不亮
            state.setText("关闭");
            l1.change(false);
            l2.change(false);
            thread.pause();
        }
        if (b1.isSelected() && !b4.isSelected()) { // 从最近一次电源打开状态算起
            state.setText("开启");
            b2.clearCount();
            b3.clearCount();
            thread = new CheckLightThread();
            thread.start();
        }
    }

    public static void main(String[] args) {
        new Bulb();
    }

    private class BulbButton extends JToggleButton {
        private int count = 0;

        public BulbButton(String text) {
            super(text);
        }

        public void changeState() {
            if (isSelected()) {
                ++count;
            }
        }

        public void clearCount() {
            count = 0;
        }

        public int getCount() {
            return count;
        }
    }

    private class BulbLight extends JPanel {
        private int id;
        private boolean bad;
        private boolean lightState;
        private JLabel label;
        private JLabel state = new JLabel("【暗】");
        private JLabel state2 = new JLabel("-正常");

        public BulbLight(int id) {
            this.id = id;
            label = new JLabel("灯泡" + id);
            this.add(label);
            this.add(state);
            this.add(state2);
        }

        public int getId() {
            return id;
        }

        public void light() {
            this.state.setText("【"
                    + ("【暗】".equals(this.state.getText()) ? "亮" : "暗") + "】");
        }

        public void change(boolean light) {
            if (bad)
                return;
            lightState = light;
            this.state.setText("【" + (lightState ? "亮" : "暗") + "】");
        }

        public boolean isBad() {
            return bad;
        }

        public void setState(boolean bad) {
            this.bad = bad;
            state2.setText((bad ? "-故障" : "-正常"));
            if (bad) {
                this.state.setText("【暗】");
            } else {
                this.state.setText("【" + (lightState ? "亮" : "暗") + "】");
            }
        }
    }

    private class BuldStateButton extends JButton implements ActionListener {
        private BulbLight light;

        public BuldStateButton(BulbLight light) {
            super("破坏灯泡" + light.getId());
            this.light = light;
            this.addActionListener(this);
        }

        public void actionPerformed(ActionEvent e) {
            if (("破坏灯泡" + light.getId()).equals(this.getActionCommand())) {
                this.setText("修复灯泡" + light.getId());
                light.setState(true);
            } else {
                this.setText("破坏灯泡" + light.getId());
                light.setState(false);
            }
        }
    }

    private class CheckLightThread extends Thread {
        private boolean runFlag = true;

        public void pause() {
            this.runFlag = false;
        }

        public void run() {
            while (runFlag) {
                try {
                    if (l1.isBad() && !l2.isBad()) {
                        l2.light();
                    }
                    if (!l1.isBad() && l2.isBad()) {
                        l1.light();
                    }
                    sleep(INTER_SECOND);
                } catch (Exception e) {
                    System.out.println(e.getMessage());
                }
            }
        }
    }
}

运行结果:

时间: 2024-10-10 05:20:42

作业四:灯泡异常问题的相关文章

手动脱PeCompact 2.20壳实战-吾爱破解培训第一课选修作业四

作者:Fly2015 PeCompact壳又是一个没有听说过的壳,需要脱壳的程序是吾爱破解培训的第一课的选修作业四.最近对脱壳有点上瘾了,当然也遭受了脱壳受挫的无奈,但是比较幸运还是把这个壳给搞了. 对加壳程序进行查壳. 工具DIE显示程序加的是PeCompact壳,并且原来没加壳的程序使用Microsoft Visual C/C++(2008)编写的,这一点对于查找原程序的真实OEP非常有帮助. OD载入加壳的程序进行分析,加壳程序的入口点的汇编代码. F8走了几步,坑啊,写壳的作者在代码中设

Java解惑四:异常之谜

谜题36 finally语句中的return语句会覆盖掉try语句中的. 谜题37 该部分还需要进一步理解 一个方法可以抛出的被检查异常集合是它所适用的所有类型声明要抛出的被检查集合的交集. Java解惑四:异常之谜,布布扣,bubuko.com

機器學習基石(Machine Learning Foundations) 机器学习基石 作业四 Q13-20 MATLAB实现

大家好,我是Mac Jiang,今天和大家分享Coursera-NTU-機器學習基石(Machine Learning Foundations)-作业四 Q13-20的MATLAB实现.以前的代码都是通过C++实现的,但是发现C++实现这些代码太麻烦,这次作业还要频繁更改参数值,所以选择用MATLAB实现了.与C++相比,MATLAB实现显然轻松很多,在数据导入方面也更加方便.我的代码虽然能够得到正确答案,但是其中可能有某些思想或者细节是错误的,如果各位博友发现,请及时留言纠正,谢谢!再次声明,

機器學習基石(Machine Learning Foundations) 机器学习基石 作业四 课后习题解答

大家好,我是Mac Jiang,今天和大家分享coursera-NTU-機器學習基石(Machine Learning Foundations)-作业四的习题解答.笔者在做这些题目时遇到很多困难,当我在网上寻找答案时却找不到,而林老师又不提供答案,所以我就想把自己做题时对题目如何思考的写下来,为大家提供一些思路.当然,我对题目的理解不一定是正确的,如果各位博友发现错误请及时留言联系,谢谢!再次提醒:请不要以此博客作为通过考试的用途,还是更好学习.理解课程的途径!希望我的博客对您的学习有所帮助!

2017.11.17——作业四用户体验分析:以 “师路南通网站” 为例

作业四.用户体验分析:以 "师路南通网站" 为例 作业目标:针对师路南通 ,开展UX分析,基于实例分析,体会用户体验设计的 7 条准则. 首先是"师路南通"的简单页面介绍 师路南通功能列表: 在页面的首页可以看到"师路南通"网页的一些功能板块有哪些,详情点击就可以看到,首页只罗列了部分重点,例如"近期研修","经典研修"等等 接下来是我觉得"师路南通" 在用户体验设计方面让我觉得满意和不

软件测试--作业四

<软件测试>第四次作业 1.某公司网站的后台管理有一个用户注册的功能需要测试,该测试为黑盒测试,请用表格的方式给出该功能的测试用例(参考课本P107页).用户注册功能描述如下: (1)       管理员必须先登录,方可进入网站后台管理,进入后台管理界面后可以进行用户注册(假设用户注册的URL地址为http://www.fengt.com/Admin/UserRegister.jsp) (2)       用户注册要求输入用户名.密码.密码确认.邮箱,这4项内容均不能为空 (3)      

Java基础知识二次学习--第四章 异常

第四章 异常处理 时间:2017年4月26日11:16:39~2017年4月26日11:28:58 章节:04章_01节 04章_02节 视频长度:20:46+01:16 内容:异常的概念 心得: Java异常是JAVA提供的用于处理程序中错误的一种机制 实在运行的过程中发生的一些异常事件(比如除0溢出,数组越界,要读取的文件不存在) 设计良好的程序应该在异常发生时提供处理这些错误的方法,使得程序不会因为异常的发生而阻断或产生不可预见的结果 JAVA程序的执行过程中 如果出现异常事件,可以生成异

团队作业四-团队项目汇总

一.Daily Scrum Meeting[Alpha] 团队作业4--第一次项目冲刺(Alpha版本)预备工作 团队作业4--第一次项目冲刺(Alpha版本)第一天 and 第二天 团队作业4--第一次项目冲刺(Alpha版本)第三天 团队作业4--第一次项目冲刺(Alpha版本)第四天 团队作业4--第一次项目冲刺(Alpha版本)第五天 团队作业4--第一次项目冲刺(Alpha版本)第六天and第七天 二.Daily Scrum Meeting[Beta] 三.git git地址: htt

Linux内核实验作业四

实验作业:使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用 20135313吴子怡.北京电子科技学院 [第一部分]使用库函数API来获取用户标识号.库函数为getuid() 代码如下: 编译运行之后,将用户id号1000打印输出在屏幕上. [第二部分]使用汇编方式触发系统调用来获取用户标识号.库函数依旧为getuid() 代码如下: 可以看出,打印出来的用户id和之前的一样都是1000. [第三部分]系统调用的工作机制学习总结 我认为系统调用的工作机制就是系统调用经过封装包装成为