我是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上的复选框对象?任何帮助将不胜感激。
谢谢!
答案 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();
}
}
}