灯泡问题

假设需要制造一个带有四个按钮和两个灯泡的盒子并具有以下功能:

    ⑴ 有四个按钮输入,分别称为B1,B2,B3和B4;

    ⑵ 有两个灯泡作为输出,分别称为L1和L2;

    ⑶ B1是打开电源的按钮;

    ⑷ B4是关闭电源的按钮;

    ⑸ B2和B3 是操作按钮;

    ⑹ 在B1被按下后及B4被按下前,系统应称为电源打开状态;

    ⑺ 在B4被按下后及B1被按下前,系统应称为电源关闭状态;

    ⑻ 在电源关闭状态下,B2和B3按钮不起作用;

    ⑼ 在电源关闭状态下,灯应不亮;

    ⑽ 从最近一次电源打开状态算起,如果B2被按下的次数比B3被按下的次数多,L1亮,否则L2亮。

    ⑾ 任何时候都不能有一个以上的灯泡亮;

    ⑿ 如果其中的一个灯泡出现故障,另一个灯泡应以2秒钟的间隔闪烁,而不管B2和B3的操作过程。当B4按下时,闪烁停止;当B1被按下时,闪烁重新开始。当故障被排除后闪烁停止,系统恢复正常状态。

 

 

 

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

转载于:https://www.cnblogs.com/634810242boke/p/6075195.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
叶庆生老师的软件工程与方法学的上机作业,包括: 1. 假设需要制造一个带有四个按钮两个灯泡盒子并具有以下功能: ⑴ 有四个按钮输入,分别称为B1,B2,B3和B4; ⑵ 有两个灯泡作为输出,分别称为L1和L2; ⑶ B1是打开电源的按钮; ⑷ B4是关闭电源的按钮; ⑸ B2和B3 是操作按钮; ⑹ 在B1被按下后及B4被按下前,系统应称为电源打开状态; ⑺ 在B4被按下后及B1被按下前,系统应称为电源关闭状态; ⑻ 在电源关闭状态下,B2和B3按钮不起作用; ⑼ 在电源关闭状态下,灯应不亮; ⑽ 从最近一次电源打开状态算起,如果B2被按下的次数比B3被按下的次数多,L1亮,否则L2亮。 ⑾ 任何时候都不能有一个以上的灯泡亮; ⑿ 如果其中的一个灯泡出现故障,另一个灯泡应以2秒钟的间隔闪烁,而不管B2和B3的操作过程。当B4按下时,闪烁停止;当B1被按下时,闪烁重新开始。当故障被排除后闪烁停止,系统恢复正常状态。 2.1.一家公司有许多部门,部门名唯一地确定一个部门;每个部门由一名经理管理,也有的经理并不管理任何一个部门;每个部门生产多种产品,每种产品仅由一个部门生产。该公司有许多名员工为之工作,员工又进一步划分为经理和工人两类。每名工人可参加多个工程项目,每个项目需要多名工人;每位经理可以主持多个项目,每个项目仅有一人主持。使用对象模型描述类对象所具有的属性,以及公司类对象提供的服务。 2.2建立一个图书馆系统的用例视图 还有其他很多

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值