我现在正在做一个小说阅读器,用到了JTree。
界面很简单啦,左边是JTree(放在JScrollPane中),右边是文本域。
JTree读取文件系统,生成树状视图,当然一次只读一层。
当点击树状视图的节点是文本文件时,就在右侧的文本域中显示小说内容。注意,问题来啦:
我想在下次打开程序时,还能够保持JTree的状态,并且滚动到上次点中的那个节点位置。其实就是想接下去读小说啦。
高手们请指教啦。JTree 保存状态
界面很简单啦,左边是JTree(放在JScrollPane中),右边是文本域。
JTree读取文件系统,生成树状视图,当然一次只读一层。
当点击树状视图的节点是文本文件时,就在右侧的文本域中显示小说内容。注意,问题来啦:
我想在下次打开程序时,还能够保持JTree的状态,并且滚动到上次点中的那个节点位置。其实就是想接下去读小说啦。
高手们请指教啦。JTree 保存状态
private JTree jtree;
public TestJTree(){
setLayout(null);
setBounds(100, 100, 400, 300);
File file = new File("jtree.ser");
if(file.exists()){
try {
ObjectInputStream in = new ObjectInputStream(new FileInputStream("jtree.ser"));
jtree = (JTree) in.readObject();
} catch (FileNotFoundException e1) {
e1.printStackTrace();
} catch (IOException e1) {
e1.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}else{
jtree = new JTree();
jtree.setBounds(0, 20, 100, 300);
}
add(jtree);
setVisible(true);
addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
try {
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("jtree.ser"));
out.writeObject(jtree);
out.close();
} catch (FileNotFoundException e1) {
e1.printStackTrace();
} catch (IOException e1) {
e1.printStackTrace();
}
System.exit(0);
}
});
}
public static void main(String[] args){
new TestJTree();
}
}
E:\novel\大道主\3701683.txt
而一开始载入树状视图时,只载入第一层,只有C:、D:、E:等
怎么办?
反序列化之后按当前展开的加载一次不行吗?第二个问题,把JScrollPanel直接也序列化不行么?
总结一下出现的问题:
1、如果有多个对象要序列化,应该创建一个类,并将多个对象定义为属性。
注意:该类不可以定义为内部类。我开始就用内部类,一直错。
2、可以直接把整个树的数据模型序列化,因为DefaultTreeModel已经实现了序列化接口。
这样就很方便了。
3、滚动面板不用整个序列化,只要序列化它的这个值:
scrollPane.getVerticalScrollBar.getValue()
恢复时用:
scrollPane.getVerticalScrollBar.setValue()
4、如果树状视图的用户对象是自定义的,例如我定义了一个类,包含文字、图标、文件对象等。
请注意:Icon图标是不可序列化的(它是接口),需要用实现类ImageIcon。散分啦。
tree.setExpandsSelectedPaths(true);
可以自动展开选中的节点tree.setSelectionPath(treePath);
可以选中一个节点