将模式恢复到CheckBox的ArrayList?

时间:2017-02-14 07:28:03

标签: java arraylist checkbox

它是一个带有256个复选框的beatBox程序,用于制作轨道并运行它。 使用start,stop,loadTrack和saveTrack选项。 当我们单击开始按钮时,它会遍历所有复选框并使用它们进行跟踪。下面是通过JFileChooser和FileInput Stream恢复checkBoxes值的代码。

void buildAndStartTrack(){

ArrayList checkBoxList = new ArrayList<JCheckBox>();
for ( int i=0; i<256; i++)
    {
        JCheckBox c = new JCheckBox();
        c.setSelected(false);
        checkBoxList.add(c);
        mainPanel.add(c);
    } // end loop
  }
//here some more code to maketracks and start sequencer
}

public class MyObjectLoadListener implements ActionListener{
    public void actionPerformed(ActionEvent event)
    {
        JFileChooser fileLoad = new JFileChooser();
        fileLoad.showOpenDialog(theFrame);
        LoadedFile(fileLoad.getSelectedFile());

    }
}

public void LoadedFile(File file)
{
    boolean [] checkBoxState = null;

    try
    {
        FileInputStream fileIn = new FileInputStream(file);
        ObjectInputStream is = new ObjectInputStream(fileIn);
        checkBoxState = (boolean[]) is.readObject();
    }
    catch(Exception ex)
    {
        ex.printStackTrace();
    }

恢复checkBox的值而不是它将调用buildAndStartTrack

//how i did it myself (It has a bug but its working fine)       
for (int i=0; i<256; i++)
    {
        JCheckBox check = new JCheckBox();
        if(checkBoxState[i])
        {
            check.setSelected(true);
            checkBoxList.set(i, check);
        }
        else
        {
            check.setSelected(false);
            checkBoxList.set(i, check);
        }
    }

    sequencer.stop();
    buildTrackAndStart();
}

比我查看这本书并找到了这段代码。即使在互联网和论坛上搜索checkBoxs,arraylist主题两天后,我也无法得到它。

for (int i=0; i<256; i++)
    {
        JCheckBox check = (JCheckBox) checkBoxList.get(i);
        if(checkBoxState[i])
        {
            check.setSelected(true);  // here doubt
 // check is on left handside  
 // so changing its value shouldn't effect value on right hand side i.e    checkBoxList.get(i)
        }
        else
        {
            check.setSelected(false);
        }

但左侧的任务正在影响右侧的价值。

2 个答案:

答案 0 :(得分:1)

JCheckBox是参考类型。

当您执行任务声明时:

someVariable = someValue;

如果双方都是参考类型,那么真的很酷。

引用类型变量存储对实际对象的引用,即复选框本身。上述声明指定someValuesomeVariable持有的引用。换句话说,它使someVariablesomeValue引用同一个对象。

现在进入这一行

JCheckBox check = (JCheckBox) checkBoxList.get(i);

正如我所说,checkcheckBoxList.get(i)现在将引用相同的复选框,因为它们是引用类型变量。当你说:

check.setSelected(true);

相当于:

checkBoxList.get(i).setSelected(true);

因为两个变量引用相同的复选框。

答案 1 :(得分:0)

它会影响该值,因为当您执行check时,您会为checkBoxList.get(i)实例分配check.setSelected(true);引用。然后你在那个实例上执行{{1}}(记住 - 它仍然是同一个实例)。