2013-10-28 141 views
0

我是新来的Java和努力的东西,我敢肯定必须有一个简单的答案,但我似乎无法找到它。 我有复选框对象数组定义为:Java JCheckBox ArrayList帮助需要

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可以使用'Save'和'Load'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上的复选框对象?任何帮助将非常感激。

谢谢!

+0

需要一点澄清。你想在面板上反思它吗? – Sage

+0

你不需要实现Serializable,ArrayList已经实现了Serializable。 – Madeyedexter

回答

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

如果你已经有了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()); 
+0

这非常完美,尽管我做了几个微妙的变化 - 我做了保存和加载在“for”循环一个ArrayList保存为一个迭代器,即'有必要(JCheckBox的C:CheckBoxList的){ \t \t \t \t \t os.writeBoolean(c.isSelected()); \t \t \t \t}' – Anton