Java功课问题

时间:2010-09-08 17:13:33

标签: java

请建议如何在java中使用else的多个复选框,请检查下面的代码

if(cb1.isSelected())
MyFrame9 m1=new MyFrame9();
else if(cb2.isSelected())
MyFrame10 m1=new MyFrame10();
else if(cb3.isSelected())
MyFrame11 m1=new MyFrame11();
else if(cb4.isSelected())
MyFrame12 m1=new MyFrame12();
else if(cb1.isSelected() && cb2.isSelected())
MyFrame13 m1=new MyFrame13();
else if(cb1.isSelected() && cb3.isSelected())
MyFrame14 m1=new MyFrame14();
else if(cb1.isSelected() && cb4.isSelected())
MyFrame15 m1=new MyFrame15();
else if(cb2.isSelected() && cb3.isSelected())
MyFrame16 m1=new MyFrame16();
else if(cb2.isSelected() && cb4.isSelected())
MyFrame17 m1=new MyFrame17();
else if(cb3.isSelected() && cb4.isSelected())
MyFrame18 m1=new MyFrame18();
else if(cb1.isSelected() && cb2.isSelected() && cb3.isSelected())
MyFrame19 m1=new MyFrame19();
else if(cb1.isSelected() && cb2.isSelected() && cb4.isSelected())
MyFrame20 m1=new MyFrame20();
else if(cb2.isSelected() && cb3.isSelected() && cb4.isSelected())
MyFrame21 m1=new MyFrame21();
else if(cb3.isSelected() && cb4.isSelected() && cb1.isSelected())
MyFrame22 m1=new MyFrame22();
else(cb1.isSelected() && cb2.isSelected() && cb3.isSelected() && cb4.isSelected())
MyFrame23 m1=new MyFrame23();
}

3 个答案:

答案 0 :(得分:4)

代码有点可怕;对于每个else内容,代码声明并实例化一个永远不会被使用的变量(因为在块中声明的变量不能在所述块之外使用),编译器会说你的代码不是有效的语句并且不会编译。

另外,大多数if都不会通过,因为无法访问条件。例如:

if(cb1.isSelected())
    MyFrame9 m1=new MyFrame9();
else if(cb2.isSelected())
    MyFrame10 m1=new MyFrame10();
else if(cb3.isSelected())
    MyFrame11 m1=new MyFrame11();
else if(cb4.isSelected())
    MyFrame12 m1=new MyFrame12();
else if(cb1.isSelected() && cb2.isSelected())
    MyFrame13 m1=new MyFrame13();

如果选中cb1,则会调用MyFrame9 m1=new MyFrame9()。如果选中cb2 MyFrame10 m1=new MyFrame10();,则无法调用MyFrame13 m1=new MyFrame13();


资源:

答案 1 :(得分:3)

首先,请考虑使用switch语句而不是else if语句链。

其次,那些真的是你的变量名吗?您可能希望使用更多的上下文声明变量。

最后,这段代码应该做什么?您的问题询问如何使用else if的多个复选框。好吧,你已经做到了。这是一团糟,它似乎没有做任何事情,但你已经做到了。有什么不行吗?如果是,请解释。

答案 2 :(得分:1)

如果您的老师正在使用此练习来帮助您学习语句,那么您需要在基本案例之前考虑更复杂的案例。 知道如果Boxes {1,2,3,4}全部被选中,但你首先检查Box {1},那么无论选中多少个盒子,你都只能显示你的Frame9。尝试重新安排你的if结构来检查所有4个都被检查的情况,然后检查任何3,然后向后工作到你的各个方框的最终if / else语句。

if(all 4 checked)
else if (any 3 checked)
else if (any 2 checked)
else if (any 1 checked)

这第二个选项可能比您的作业或已经学习的内容多一点。但是考虑初始化HashMap中的各种状态?然后,当选中一个按钮时,您将返回并检查每个复选框的状态。如果选中该框,则设置某种形式的标志(按位操作在这里工作正常)。执行此操作后,您可以在hashmap中执行查找以检索正确的类。 如果陈述确定你的行动方案,那么肯定是正面的,负面的是更多的记忆和更多的初始化时间。

e.x。假设你所有的“新框架”都是扩展JFrame的类。如果在按钮上创建动作侦听器,则可以使用以下全局变量

HashMap<Integer, Class<? extends JFrame>> frameName = null;

然后在调用构造函数时,填充HashMap

frameName = new HashMap<Integer, Class<? extends JFrame>>();
frameName.put(1<<0, Frame9.class); //only the first box is checked
//Box 2,3 and 4 checked, resulting in 1110 (binary) which stores 
//in the hashmap as 14
frameName.put(1<<1 | 1<<2 | 1<<3, Frame21.class); 
//add this for all 15 options.

单击复选框后,您可以填充状态并在HashMap表中执行查找。假设默认操作是创建给定的JFrame并显示它。

public void actionPerformed(ActionEvent e) {
    JFrame myNewFrame = null;
    int state = 0;
    if(e.getSource() instanceof JCheckBox){
        if(((JCheckBox)e.getSource()).isSelected()){
            if(cb1.isSelected())
                state |= 1<<0; // 1b
            if(cb2.isSelected())
                state |= 1<<1; // 10b
            if(cb3.isSelected())
                state |= 1<<2; // 100b
            if(cb4.isSelected())
                state |= 1<<3; // 1000b

            try {
                myNewFrame = frameName.get(state).newInstance();
                myNewFrame.setVisible(true); 
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }
    }
}

这绝不是最佳解决方案,但它确实有助于减少解决方案中嵌套if语句的数量,并使其更具可读性。