作业四:灯泡异常问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了作业四:灯泡异常问题相关的知识,希望对你有一定的参考价值。

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

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());
                }
            }
        }
    }
}

运行结果:

技术分享技术分享技术分享技术分享

以上是关于作业四:灯泡异常问题的主要内容,如果未能解决你的问题,请参考以下文章

作业一

作业1

读构建之法第十七章有感(作业四)

Codeforces Round #612

灯泡问题

灯泡问题