请建议如何在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();
}
答案 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语句的数量,并使其更具可读性。