0

我是 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 并且可以使用“保存”和“加载”GUI 按钮来保存和恢复这个复选框的 ArrayList。我加载保存对象的代码如下:

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 上的复选框对象?任何帮助将非常感激。

谢谢!

4

2 回答 2

0

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

//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();

如果您已经将 JCheckBoxes 实例化并很好地放入您的数组列表中,请在读取保存的文件时执行此操作:

 // 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());
于 2013-10-28T21:59:45.747 回答
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();
        }
    }
}
于 2018-03-25T08:39:55.407 回答