假设需要制造一个带有四个按钮和两个灯泡的盒子并且有以下功能:
(1)有四个按钮输入,分别称为B1,B2,B3,B4;
(2)有两个灯泡作为输出,分别称为L1和L2;
(3)B1是打开电源的按钮;
(4)B4是关闭电源的按钮;
(5)B2和B3是操作按钮;
(6)在B1被按下后及B4被按下前,系统应称为电源打开状态;
(7)在B4被按下后及B1被按下前,系统应称为电源关闭状态;
(8)在电源关闭状态下,B2和B3按钮不起作用;
(9)在电源关闭状态下,灯应不亮;
(10)从最近一次电源打开状态算起,如果B2被按下的次数比B3被按下的次数多,L1亮,否则L2亮;
(11)任何时候都不能有一个以上的灯泡亮;
(12)如果其中的一个灯泡出现故障,另一个灯泡应以2秒钟的间隔闪烁,而不管B2和B3的操作过程。当B4按下时,闪烁停止;当B1被按下是,闪烁重新开始。当故障别排除后闪烁停止,
系恢复正常状态; 小弟初学JAVA,请问用JAVA如何实现这个程序?希望大家可以帮帮我,谢谢大家了!
(1)有四个按钮输入,分别称为B1,B2,B3,B4;
(2)有两个灯泡作为输出,分别称为L1和L2;
(3)B1是打开电源的按钮;
(4)B4是关闭电源的按钮;
(5)B2和B3是操作按钮;
(6)在B1被按下后及B4被按下前,系统应称为电源打开状态;
(7)在B4被按下后及B1被按下前,系统应称为电源关闭状态;
(8)在电源关闭状态下,B2和B3按钮不起作用;
(9)在电源关闭状态下,灯应不亮;
(10)从最近一次电源打开状态算起,如果B2被按下的次数比B3被按下的次数多,L1亮,否则L2亮;
(11)任何时候都不能有一个以上的灯泡亮;
(12)如果其中的一个灯泡出现故障,另一个灯泡应以2秒钟的间隔闪烁,而不管B2和B3的操作过程。当B4按下时,闪烁停止;当B1被按下是,闪烁重新开始。当故障别排除后闪烁停止,
系恢复正常状态; 小弟初学JAVA,请问用JAVA如何实现这个程序?希望大家可以帮帮我,谢谢大家了!
解决方案 »
- 请看一下,sql 2005 驱动的问题,谢谢!
- 为什么只能有第一个if语句的功能?后面的语句都没执行
- 用httpclient和httprequest模拟请求出现邪门的乱码,求助
- 关于static的疑问
- RTFEditorKit读中文rtf文件失败
- java程序题
- 在执行 invoke 方法的时候报 InvocationTargetException 异常
- tomcat配连接池的问题
- 真郁闷.昨天打赌输了.德国1:1平荷兰了..有段代码请大侠帮忙看一下.
- 原始字符串是"abc",打印得到下列所有组合情况java如何实现要有注释,谢谢
- 这段代码为什么有这样的问题?
- 关于窗体最大化 最小化 还原的问题
//保存为TestBox.java
//测试类
public class TestBox{
public static void main(String[] args){
Box box = new Box();
box.b1(); //打开电源
box.b2();//按b2 (对应L1)
box.b3(); //按b3 (对应L2)
box.b3(); //按b3 (对应L2)
box.showL1L2Status();
box.brokenLight1(); //砸烂L1
box.showL1L2Status();//显示2个灯的状态
box.b4(); //关灯
box.showL1L2Status(); //显示2个灯的状态
box.b1(); //再开灯
box.showL1L2Status(); //显示2个灯的状态
box.repairLight(); //关灯,修理灯
box.showL1L2Status(); //显示2个灯的状态
box.b1(); //修理后重新打开电源
box.b2();
box.showL1L2Status();
}
}
//盒子类
class Box {
private boolean power = false;//电源
private Light l1 = new Light();//电灯一
private Light l2 = new Light();//电灯二
public void b1(){ //开打电源
power = true;
l1.setCount(0); //每次重开电源,重新计算L1,L2被按的次数
l2.setCount(0);
}
public void b2(){ //按b2按钮,对应L1
if( !power){ //如果电源没开,不响应,
return;
}
else{
this.l1.AddCount();
//System.out.println("l2:" + l1.getCount());
if( !checkBroken()){ //只有灯没坏时才响应
int light1Count = l1.getCount();
int light2Count = l2.getCount();
if( light1Count > light2Count){
l1.setStatus("light");
l2.setStatus("unlight");
}
else {if ( light2Count > light1Count){
l2.setStatus("light");
l2.setStatus("unlight");
}
else {
l1.setStatus("unlight");
l2.setStatus("unlight");
}}
}//if(!checkBroken)
else{ //灯坏了,就不响应
if( l1.getStatus().equals("broken")){
l2.setStatus("glimpse");
}
else{
l1.setStatus("glimpse");
}
}// checkBroken else
}
}
public void b3(){ //参照b2的注释
if( !power){
return;
}
else{
this.l2.AddCount();
//System.out.println("l2:" + l2.getCount());
if( !checkBroken()){
int light1Count = l1.getCount();
int light2Count = l2.getCount();
if( light1Count > light2Count){
l1.setStatus("light");
l2.setStatus("unlight");
}
else{ if ( light2Count > light1Count){
l2.setStatus("light");
l1.setStatus("unlight");
}
else {
l1.setStatus("unlight");
l2.setStatus("unlight");
} }
}//if(!checkBroken)
else{
if( l1.getStatus().equals("broken")){
l2.setStatus("glimpse");
}
else{
l1.setStatus("glimpse");
}
}// checkBroken else
}
}
public void b4(){ //关电源
power = false;
//没坏的话,就设置灯为关闭状态,否则保持原来的状态
if ( (!this.l1.getStatus().equals("broken"))
&&(!this.l2.getStatus().equals("broken"))){
l1.setStatus("unlight");
l2.setStatus("unlight");
}
}
//关灯,并将坏的灯泡休息好
public void repairLight(){
System.out.println("操作:关电灯,修理");
b4();
l1.setStatus("unlight");
l2.setStatus("unlight");
}
//将L1砸烂
public void brokenLight1(){
l1.setStatus("broken");
l2.setStatus("glimpse");
}
//将L2砸烂
public void brokenLight2(){
l2.setStatus("broken");
l1.setStatus("glimpse");
}
//显示目前灯的状态
public void showL1L2Status(){
if(power){
System.out.println("L1的状态:" + l1.getStatus());
System.out.println("L2的状态:" + l2.getStatus());
}
else{
System.out.println("L1的状态:unlight");
System.out.println("L2的状态:unlight");
}
}
//检查是否有灯坏了,有的话返回true,否则返回false
public boolean checkBroken(){
boolean flag = false;
if( l1.getStatus().equals("broken") || l2.getStatus().equals("broken")){
flag = true;
}
return flag;
}
}
//灯泡类
class Light{
private String status = "unlight";//状态,从unlight light glimpse broken中选一个
private int count = 0;
//被按下按钮的次数+1
public void AddCount(){
this.count++;
}
//取得被按下的次数
public int getCount(){
return this.count;
}
//设置被按下的次数
public void setCount(int count){
this.count = count;
}
//取得灯泡的状态
public String getStatus(){
return this.status;
}
//设置灯泡的状态
public void setStatus(String status){
this.status = status;
}}
其实这道题最好的设计模式就是借鉴java的awt或swing,button相当于awt的button,box相当于容器,就当作frame好了,lamp相当button以外的component,就当作image或panel都行。这样的话可以模仿awt写一套class
以下给出模型,具体就不写了
interface ButtonListener {
onClick(ButtonEvent e);
}class ButtonEvent {
Object src;
int eventId;
Map optionalInfo; public ButtonEvent(Object src, int eventId) {
//
}
}class Component {
//这里追加共有的属性和方法,比如setSize, setLocation, setBounds之类的,这样可以设置控件的大小位置,比如要控件放在box的那个位置,尺寸多少
}class Button extends Component{
List listeners;
int clickCount;
public void addButtonListener(ButtonListener l) { } public void removeButtonListener(ButtonListener l) { } protected doClick() {
//这里面要发生ButtonEvent事件,然后回调listener
}
}class Lamp extends Component {
int state; //状态
Color color; //灯光颜色
//还可以设置些比如功率,额定电压等等属性,然后追加相应的方法 FlashThread flashThread; //闪烁用线程 public powerOn() { } public powerOff() { } public flash(long time) { } public stopFlash() { } class FlashThread extends Thread {
public void run() { }
}
}class Container {
//这里设置容器的共同属性和方法,比如add(Component c)等等,用以添加控件到容器上
}class Box extends Container implements ButtonListener {
Button[4] buttons;
Lamp[2] lamp; public Box () {
} public void onClick(ButtonEvent e) {
Object obj = e.getSource();
if (obj == buttons[0]) { } else if ...
}
}
以上这样的设计模式,是按sun的awt或swing的思想去实现的,应该最符合面向对象的设计
LZ可能现在理解有限,不过将来等你技术有所提高后再回过头来看,这道题还是蛮值得研究的。
就用swing写一套基于图形化的,其实不难,有空再给你写一个。
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;class BoxButton extends JButton {
int clickCount;
public BoxButton(String text) {
super(text);
}
public void addClickCount() {
clickCount++;
}
public int getClickCount() {
return clickCount;
}
}final class FlashThread extends Thread {
private Lamp lamp;
private long interval;
public FlashThread(Lamp lamp, long interval) {
this.lamp = lamp;
this.interval = interval;
}
public void run() {
try {
while (true) {
if (lamp.getState() != Lamp.STATE_FLASH) break;
System.out.println("闪烁...");
lamp.repaint();
sleep(interval/2);
lamp.repaint();
sleep(interval/2);
}
} catch (Throwable e) {
e.printStackTrace();
}
}
}class Lamp extends JPanel {
public static final int STATE_ERR = -1;
public static final int STATE_OFF = 0;
public static final int STATE_ON = 1;
public static final int STATE_FLASH = 9; protected int state;
protected Color color;
protected FlashThread flashThread;
protected int flashOrder = 0;
public Lamp() {
super();
color = Color.white;
state = STATE_OFF;
}
public Lamp(Color color) {
super();
this.color = color;
state = STATE_OFF;
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
doPaint(g);
}
protected void doPaint(Graphics g) {
if (state != STATE_ON && state != STATE_FLASH) return;
g.setColor(color);
if (state == STATE_FLASH) {
if (flashOrder == 0) {
g.setColor(getBackground());
flashOrder = 1;
} else {
flashOrder = 0;
}
}
int x = (int)(getWidth() / 2);
int y = (int)(getHeight() / 2);
int r = (x>y) ? y : x;
g.fillOval(x, y, r, r);
}
public void powerOn() {
if (state != STATE_OFF) return;
state = STATE_ON;
System.out.println(color + " 电源ON");
repaint();
}
public void powerOff() {
if (state == STATE_OFF) return;
if (state != STATE_ERR) {
state = STATE_OFF;
}
System.out.println(color + " 电源OFF");
repaint();
}
public void flash(long interval) {
if (state != STATE_ON) return;
state = STATE_FLASH;
System.out.println(color + " 闪烁...");
flashThread = new FlashThread(this, interval);
flashThread.start();
}
public void stopFlash() {
if (state != STATE_FLASH) return;
state = STATE_ON;
System.out.println(color + " 闪烁停止");
repaint();
}
public int getState() {
return state;
}
public Color getColor() {
return new Color(color.getRGB());
}
public void setAccident() {
if (state == STATE_ERR) return;
if (state != STATE_OFF) {
//
}
state = STATE_ERR;
repaint();
}
public void fixAccident() {
if (state != STATE_ERR) return;
state = STATE_OFF;
repaint();
}
}
两部分合起来就可以测试了(本来是在一个帖里回复的,但是字数超过了,只好分开了)
public class Box extends JFrame implements ActionListener {
private BoxButton[] buttons;
private Lamp[] lamps;
private JButton[] accidentButtons;
private int state;
private int lastOn;
static final int interval = 2000; public static void main(String[] args) {
new Box();
}
public Box() {
super("Box Test");
setSize(400, 300);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container container = getContentPane();
container.setLayout(null);
lamps = new Lamp[2];
lamps[0] = new Lamp(Color.red);
lamps[0].setBounds(10, 10, 80, 80);
container.add(lamps[0]);
lamps[1] = new Lamp(Color.green);
lamps[1].setBounds(100, 10, 80, 80);
container.add(lamps[1]);
buttons = new BoxButton[4];
buttons[0] = new BoxButton("电源ON");
buttons[0].setBounds(10, 120, 80, 20);
buttons[0].addActionListener(this);
buttons[0].setToolTipText("打开电源");
container.add(buttons[0]);
buttons[1] = new BoxButton("电源OFF");
buttons[1].setBounds(100, 120, 100, 20);
buttons[1].addActionListener(this);
buttons[1].setToolTipText("关闭电源");
container.add(buttons[1]);
buttons[2] = new BoxButton("红灯+");
buttons[2].setBounds(210, 120, 80, 20);
buttons[2].addActionListener(this);
buttons[2].setToolTipText("红灯点击数控制");
container.add(buttons[2]);
buttons[3] = new BoxButton("绿灯+");
buttons[3].setBounds(300, 120, 80, 20);
buttons[3].addActionListener(this);
buttons[3].setToolTipText("绿灯点击数控制");
container.add(buttons[3]);
accidentButtons = new JButton[2];
accidentButtons[0] = new JButton("红灯Err");
accidentButtons[0].setBounds(10, 160, 80, 20);
accidentButtons[0].addActionListener(this);
accidentButtons[0].setToolTipText("红灯故障/修复控制");
container.add(accidentButtons[0]);
accidentButtons[1] = new JButton("绿灯Err");
accidentButtons[1].setBounds(100, 160, 80, 20);
accidentButtons[1].addActionListener(this);
accidentButtons[1].setToolTipText("绿灯故障/修复控制");
container.add(accidentButtons[1]);
JLabel[] label = new JLabel[2];
label[0] = new JLabel();
label[0].setBounds(10, 200, 360, 20);
label[0].setText("[电源ON]:打开电源 [电源OFF]:关闭电源");
label[1] = new JLabel();
label[1].setBounds(10, 220, 360, 20);
label[1].setText("[?灯+]:?灯点击数控制 [?灯Err/Fix]:?灯障碍控制");
container.add(label[0]);
container.add(label[1]);
state = Lamp.STATE_OFF;
lastOn = -1;
Dimension screen = Toolkit.getDefaultToolkit().getScreenSize();
int x = (int)((screen.getWidth()-getWidth())/2);
int y = (int)((screen.getHeight()-getHeight())/2);
setLocation(x, y);
setVisible(true);
}
protected void powerOn() {
if (isPowerOn()) return;
System.out.println("电源ON");
state = Lamp.STATE_ON;
if (lastOn != -1) {
lamps[lastOn].powerOn();
}
checkLamp();
}
protected void powerOff() {
if (! isPowerOn()) return;
System.out.println("电源OFF");
state = Lamp.STATE_OFF;
lamps[0].powerOff();
lamps[1].powerOff();
}
public boolean isPowerOn() {
return state == Lamp.STATE_ON;
}
protected void doLampControl(int idx) {
if (! isPowerOn()) return;
System.out.println("电灯控制");
if (idx == 0) buttons[2].addClickCount();
else if (idx == 1) buttons[3].addClickCount();
if (buttons[2].getClickCount() > buttons[3].getClickCount()) {
lamps[1].powerOff();
lamps[0].powerOn();
lastOn = 0;
} else if (buttons[3].getClickCount() > buttons[2].getClickCount()) {
lamps[0].powerOff();
lamps[1].powerOn();
lastOn = 1;
}
}
protected void doLampAccident(int idx) {
if (idx == 0) {
if (accidentButtons[0].getText().indexOf("Err") > 0) {
lamps[0].setAccident();
accidentButtons[0].setText("红灯Fix");
System.out.println("红灯故障");
} else {
lamps[0].fixAccident();
accidentButtons[0].setText("红灯Err");
System.out.println("红灯修复");
lamps[1].stopFlash();
}
} else if (idx == 1) {
if (accidentButtons[1].getText().indexOf("Err") > 0) {
lamps[1].setAccident();
accidentButtons[1].setText("绿灯Fix");
System.out.println("绿灯故障");
} else {
lamps[1].fixAccident();
accidentButtons[1].setText("绿灯Err");
System.out.println("绿灯修复");
lamps[0].stopFlash();
}
}
checkLamp();
}
protected void checkLamp() {
if (! isPowerOn()) return;
if (lamps[0].getState() == Lamp.STATE_ERR) {
if (lamps[1].getState() != Lamp.STATE_ERR) {
lamps[1].powerOn();
lamps[1].flash(interval);
}
} else if (lamps[1].getState() == Lamp.STATE_ERR) {
if (lamps[0].getState() != Lamp.STATE_ERR) {
lamps[0].powerOn();
lamps[0].flash(interval);
}
}
}
public void actionPerformed(ActionEvent e) {
Object obj = e.getSource();
if (obj == buttons[0]) {
powerOn();
} else if (obj == buttons[1]) {
powerOff();
} else if (obj == buttons[2]) {
doLampControl(0);
} else if (obj == buttons[3]) {
doLampControl(1);
} else if (obj == accidentButtons[0]) {
doLampAccident(0);
} else if (obj == accidentButtons[1]) {
doLampAccident(1);
} else {
// do nothing
}
}
}