需要Java JCheckBox ArrayList帮助

时间:2013-10-28 21:09:58

标签: java swing checkbox arraylist deserialization

我是Java的新手并且正在努力寻找一些我肯定必须有一个简单答案的东西,但我似乎无法找到它。 我有一个复选框对象数组定义为:

ArrayList<JCheckBox> checkBoxList

使用网格布局创建JPanel,并将复选框添加到JPanel和ArrayList:

for (int i = 0; i < 256; i++) {
    JCheckBox c = new JCheckBox();
    c.setSelected(false);
    checkBoxList.add(c);
    mainPanel.add(c);
 }

是的,有256个复选框!该面板被添加到JFrame中,最终显示GUI。用户可以选择256个复选框的任意组合。

我的类实现了Serializable,这个复选框的ArrayList可以使用&#39; Save&#39;保存和恢复。和#39;加载&#39; GUI按钮。我加载保存对象的代码如下:

public class LoadListener implements ActionListener {

    public void actionPerformed(ActionEvent a) {

        try {

            // Prompt the user for a load file
            JFileChooser fileLoad = new JFileChooser();
            fileLoad.showOpenDialog(mainFrame);

            // Create a object/file input stream linking to the selected file 
            ObjectInputStream is = new ObjectInputStream(new FileInputStream(fileLoad.getSelectedFile()));

            // Read the checkBox array list
            checkBoxList = (ArrayList<JCheckBox>) is.readObject();              
            is.close();

        } catch (Exception ex) {

            ex.printStackTrace();

        }

    }

在加载ArrayList对象时,正确填充了复选框的值,但是我想更新GUI上的复选框以反映这一点。 是否有捷径可寻?我假设复选框数组具有正确的值,我可以重新绘制面板/框架,但这不起作用。我想了解原因 - 我加载的复选框对象数组是否不再反映GUI上的复选框对象?任何帮助将不胜感激。

谢谢!

2 个答案:

答案 0 :(得分:0)

我认为你的问题是参考文献。正在读取的ArrayList对象仅存储保存时存储器中的JCheckBox的引用。因此,不是将整个ArrayList对象写入文件,只需保存JCheckBoxes的状态(true或false)并在读取它们时,手动将状态设置为:

//write the states
ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream("path"));
Iterator<JCheckBox> i=checkBoxList.getIterator();
while(i.hasNext())
{
JCheckBox box=i.next();
oos.writeBoolean(box.isSelected());
}
oos.close();

如果你已经将JCheckBox实例化并在你的arraylist中很好地进行了这样做在阅读保存的文件时这样做:

 // Create a object/file input stream linking to the selected file 
        ObjectInputStream is = new ObjectInputStream(new FileInputStream(fileLoad.getSelectedFile()));

for(int i=0;i<256;++i)
checkBoxList.get(i).setSelected(is.readBoolean());

答案 1 :(得分:0)

如果这对你的问题有帮助 - 这里是现成的代码版本:

 /**
 * Restore a melody from the file
 */
private class RestoreMelodiListener implements ActionListener {
    @Override
    public void actionPerformed(ActionEvent a) {
        boolean[] checkboxState = null;
        try {
            JFileChooser fin = new JFileChooser();
            fin.showOpenDialog(theFrame);

            File selectedFile = fin.getSelectedFile();

            ObjectInputStream ois = new ObjectInputStream(new FileInputStream(selectedFile));
            checkboxState = (boolean[]) ois.readObject();
        } catch (Exception e) {
            e.printStackTrace();
        }
        for (JCheckBox check : checkboxList) {
            check.setSelected(check.isSelected());
        }
        for (int i = 0; i < 256; i++) {
            JCheckBox check = checkboxList.get(i);
            check.setSelected(checkboxState != null && checkboxState[i]);
        }
        sequencer.stop();
        buildTrackAndStart();
    }
}

/**
 * Save ringtone to file
 */
private class SaveMelodiListener implements ActionListener {
    @Override
    public void actionPerformed(ActionEvent a) {
        boolean[] checkboxState = new boolean[256];
        for (int i = 0; i < 256; i++) {
            JCheckBox check = checkboxList.get(i);
            if (check.isSelected()) {
                checkboxState[i] = true;
            }
        }
        try {
            JFileChooser fin = new JFileChooser();
            fin.showOpenDialog(theFrame);

            File selectedFile = fin.getSelectedFile();

            if (selectedFile != null) {
                FileOutputStream fileStream = new FileOutputStream(selectedFile);
                ObjectOutputStream os = new ObjectOutputStream(fileStream);
                os.writeObject(checkboxState);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}