如果你的老师使用这个练习来帮助你学习If语句,那么你需要在基本案例之前考虑更复杂的案例。
要知道,如果框{1,2,3,4}都被选中,但是您首先对框{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中执行查找以检索正确的类。
积极的是较少的if语句来决定你的行动方针,消极的是更多的内存和增加的初始化时间。
e、 假设所有的“新框架”都是扩展JFrame的类。如果在按钮上创建操作侦听器,则可以具有以下全局变量
HashMap> frameName = null;
然后在调用构造函数时,填充HashMap
frameName = new HashMap>();
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语句的数量,并使其更具可读性。