我写了一个方法,把当前panel里的组件遍历,然后序列化
public void jButton1_mouseClicked(MouseEvent e) {
//保存,对象串行化
FileOutputStream f = null;
try {
f = new FileOutputStream("tmp");} catch (FileNotFoundException ex) {
System.out.println(ex.getMessage());
}
ObjectOutputStream s = null;
try {
s = new ObjectOutputStream(f);
items=new ArrayList();
//遍历得到当前所有组件
int n=jPanel3.getComponentCount();
System.out.println("totlal="+n);
for(int i=0;i<n;i++){
Component c=jPanel3.getComponent(i);
System.out.println(c.getClass().toString());
MyLabel jl=(MyLabel)c;
items.add(jl);
}
s.writeObject(items); //循环完后,在此跳转到异常报错
s.flush();
s.close();
f.close();
} catch (IOException ex1) {
System.out.println("序列化失败:"+ex1.getMessage());
} }每次执行,正常循环完后,一到写入那步就报错
而之前我在程序中没有加入一个打开文件过滤类时候,根本就不报错
但那个过滤类跟这一点关系都没有啊
我在panel里有几个标签控件,就循环几次
然后写入
郁闷~~
public void jButton1_mouseClicked(MouseEvent e) {
//保存,对象串行化
FileOutputStream f = null;
try {
f = new FileOutputStream("tmp");} catch (FileNotFoundException ex) {
System.out.println(ex.getMessage());
}
ObjectOutputStream s = null;
try {
s = new ObjectOutputStream(f);
items=new ArrayList();
//遍历得到当前所有组件
int n=jPanel3.getComponentCount();
System.out.println("totlal="+n);
for(int i=0;i<n;i++){
Component c=jPanel3.getComponent(i);
System.out.println(c.getClass().toString());
MyLabel jl=(MyLabel)c;
items.add(jl);
}
s.writeObject(items); //循环完后,在此跳转到异常报错
s.flush();
s.close();
f.close();
} catch (IOException ex1) {
System.out.println("序列化失败:"+ex1.getMessage());
} }每次执行,正常循环完后,一到写入那步就报错
而之前我在程序中没有加入一个打开文件过滤类时候,根本就不报错
但那个过滤类跟这一点关系都没有啊
我在panel里有几个标签控件,就循环几次
然后写入
郁闷~~
faint~
gktsys.frame.BgFileChooser$JAVAFileFilter下面是这个用来得到文件路径类的完整定义
package gktsys.frame;import java.io.File;
import javax.swing.JFileChooser;
import java.awt.Component;
import javax.swing.filechooser.FileFilter;/**
* <p>Title: </p> *
* <p>Description: </p>
*
* <p>Copyright: Copyright (c) 2006</p>
*
* <p>Company: </p>
*
* @author not attributable
* @version 1.0
*/
//得到背景文件类
class BgFileChooser{
transient JFileChooser fileChooser=new JFileChooser();
transient JAVAFileFilter fJpg=new JAVAFileFilter("jpg");
transient JAVAFileFilter fJpeg=new JAVAFileFilter("jpeg");
public File getFile(Component cp){
;
fileChooser=new JFileChooser("C:\\winnt");//以c:\\winnt为打开文件为对话框的默认路径
//利用addChoosableFileFilter()方法加入欲过滤的文件类型,使用addChoosableFileFilter()可以加入多种文件类型,
//若你只需要过滤出一种文件类型,可使用setFileFilter()方法.
File file = null; fileChooser.addChoosableFileFilter(fJpg);
fileChooser.addChoosableFileFilter(fJpeg);
int result = fileChooser.showOpenDialog(cp);
if (result == JFileChooser.APPROVE_OPTION) {
file = fileChooser.getSelectedFile(); }
return file; } //以JAVAFileFilter类继承FileFilter抽象类,并实现accept()与getDescription()方法.
class JAVAFileFilter extends FileFilter{
String ext;
public JAVAFileFilter(String ext){
this.ext=ext;
}
/*在accept()方法中,当程序所抓到的是一个目录而不是文件时,我们返回true值,表示将此目录显示出来.*/
public boolean accept(File file){
if (file.isDirectory()){
return true;
}
String fileName=file.getName();
int index=fileName.lastIndexOf('.');
if (index>0 && index<fileName.length()-1){
//表示文件名称不为".xxx"现"xxx."之类型
String extension=fileName.substring(index+1).toLowerCase();
//若所抓到的文件扩展名等于我们所设置要显示的扩展名(即变量ext值),则返回true,表示将此文件显示出来,否则返回
//true.
if (extension.equals(ext))
return true;
}
return false;
}
//实现getDescription()方法,返回描述文件的说明字符串!!!
public String getDescription(){
if (ext.equals("jpg"))
return "JPG(*.JPG)";
if (ext.equals("jpeg"))
return "JPEG(*.JPEG)";
return "";
}
}
}我的主应用只是创建了这个类的一个实例,然后调用方法得到File而已
但这样一来,却干扰了我的序列化
这才是奇怪的地方主要是FileFilter在作怪
BgFileChooser bfc=new BgFileChooser();
File f=bfc.getFile(this);
就这两行屏蔽这两行,序列化,反序列化一切正常
序列化失败:gktsys.frame.BgFileChooser$JAVAFileFilter好像我对JAVAFileFilter进行序列化一样,但实际上,根本没有
再f.close
当然报错了
不知道有没有分,这么到位
但问题一定还是出在你自己的label类里
我写了段测试代码
class a implements Serializable
{
b b=new b();
} class b
{
}你自己测试下items.add(new a()) 然后写对象
gktsys.frame.BgFileChooser$JAVAFileFilter什么东西?只是Exception的message
你的Exception是什么Exception
java.io.NotSerializableException: gktsys.frame.BgFileChooser$JAVAFileFilter
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1075)
at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1369)
at java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:380)
at javax.swing.JFileChooser.writeObject(JFileChooser.java:1806)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:890)
。
MyLabel 里面的所有变量都必须是可序列化的赶快把BgFileChooser序列化一下。注意变量的变量也必须可序列化
LZ我还是想不通阿
s.writeObject(items);
执行这句话怎么会报这个错
java.io.NotSerializableException: gktsys.frame.BgFileChooser$JAVAFileFilter
贴下代码 让我学习下
那么JFileChooser就有this的引用,同时this也有JFileChooser的引用(这个肯定了,上一级窗口保存下一级窗口的引用)
但子窗口也保存上级窗口的引用(parent属性)这样,实际上你的MyLabel里面都包含了this,this也包含了JFileChoose,当然间接的MyLabel对象中也包含着JFileChoose。序列化要求某一个对象的所有属性包括属性的属性都必须可序列化,自然报错了
BgFileChooser bfc=new BgFileChooser();
File f=bfc.getFile(null);
可以不?如果可以,你测试一下看看,不行就去掉吧
以前做Object流的时候也遇到好多问题,烦
File f=bfc.getFile(this);
真不知道你写成null还要这句干吗
打赌了BgFileChooser bfc=new BgFileChooser();
File f=bfc.getFile(this);
这2句就是你mylabel设计到的java.io.NotSerializableException: gktsys.frame.BgFileChooser$JAVAFileFilter
不想办法把这个JAVAFileFilter类序列化
反而去设置null只能用晕翻表示我的态度
我的MyLabel类还真没有用到
BgFileChooser bfc=new BgFileChooser();
File f=bfc.getFile(this);
这两句JAVAFileFilter是实现了FileFilter的一个自定义类
我把其中相关字段都设置成transient了,还是不行
这个FileFilter本身就是不支持序列化的,你可以试试anyway,Thanks
但是swing下面的FileFilter没有序列化 但不等于不能序列化
你帮我测试下
import java.io.Serializable;
class BgFileChooser implements Serializable{class JAVAFileFilter extends FileFilter implements Serializable{}}
这样改改看至于为啥File f=bfc.getFile(this);出错,没理解!
能否发一份你的代码让我学习下
我的msn [email protected]谢谢