我现在正在做一个小说阅读器,用到了JTree。
界面很简单啦,左边是JTree(放在JScrollPane中),右边是文本域。
JTree读取文件系统,生成树状视图,当然一次只读一层。
当点击树状视图的节点是文本文件时,就在右侧的文本域中显示小说内容。注意,问题来啦:
我想在下次打开程序时,还能够保持JTree的状态,并且滚动到上次点中的那个节点位置。其实就是想接下去读小说啦。
高手们请指教啦。JTree 保存状态

解决方案 »

  1.   

    自己顶一个,不好做啊,我有想过把File对象保存起来,关键是JTree一次只读取一层
      

  2.   

    试了下,目测是可以的public class TestJTree extends JFrame {
    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();
    }
    }
      

  3.   

    序列化是必须的,但是有一个问题,比如我当前读到的位置在:
    E:\novel\大道主\3701683.txt
    而一开始载入树状视图时,只载入第一层,只有C:、D:、E:等
    怎么办?
      

  4.   

    第一个问题,你JTree的节点如果是用的String话,是完全会被序列化,
    反序列化之后按当前展开的加载一次不行吗?第二个问题,把JScrollPanel直接也序列化不行么?
      

  5.   

    自己研究了半天,终于搞好了。
    总结一下出现的问题:
    1、如果有多个对象要序列化,应该创建一个类,并将多个对象定义为属性。
    注意:该类不可以定义为内部类。我开始就用内部类,一直错。
    2、可以直接把整个树的数据模型序列化,因为DefaultTreeModel已经实现了序列化接口。
    这样就很方便了。
    3、滚动面板不用整个序列化,只要序列化它的这个值:
    scrollPane.getVerticalScrollBar.getValue()
    恢复时用:
    scrollPane.getVerticalScrollBar.setValue()
    4、如果树状视图的用户对象是自定义的,例如我定义了一个类,包含文字、图标、文件对象等。
    请注意:Icon图标是不可序列化的(它是接口),需要用实现类ImageIcon。散分啦。
      

  6.   

    还有:
    tree.setExpandsSelectedPaths(true);
    可以自动展开选中的节点tree.setSelectionPath(treePath);
    可以选中一个节点