我在界面中有一个JTree,构造一个树后,把它序列化输出,当序列化输入的时候却得不到原来的树了,我想是不是哪个地方没有被重画?大家帮我看一看。
一共是两个类。package swing;import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.UIManager;
import javax.swing.tree.DefaultTreeModel;/**
 * 舆情分析主界面
 * 
 * @author Administrator
 * 
 */
public class MainFrame extends JPanel { private String savePath = null; // 特征树要保存的路径 private String loadPath = null; // 要加载的特征树所在的路径 private String opinionPath = null; // 评论所在的文件路径 private String resultPath = null; // 分析结果的存放路径 private int newNodeIndex = 1; // 给特征树添加节点时用于唯一标示一个节点 private JPanel treeEditPane = new JPanel(); // 窗口中上半部分用于构造树的面板 private JPanel buttonPane = new JPanel(); // 窗口下半部分用于放置操作按钮的面板 private static JFrame frame = new JFrame("舆情分析系统"); // 用于显示的窗口 private FeatureTree treePane; // 放置树的面板 public MainFrame() {
super(new GridLayout(1, 0)); // 初始化“树操作区”和“按钮区”
initTreeView(null);
initButtonView(); JScrollPane treeView = new JScrollPane(treeEditPane);
JScrollPane buttonView = new JScrollPane(buttonPane); // 中间分隔线
JSplitPane splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
splitPane.setTopComponent(treeView);
splitPane.setBottomComponent(buttonView); // 设置“树操作区”和“按钮区”大小及分隔线的位置
Dimension minimumSize = new Dimension(100, 50);
treeView.setMinimumSize(minimumSize);
buttonView.setMinimumSize(minimumSize);
splitPane.setDividerLocation(310);
splitPane.setPreferredSize(new Dimension(430, 370)); add(splitPane);
} /**
 * 初始化“树操作区”内容
 * 
 */
private void initTreeView(DefaultTreeModel argTreeModel) {


treePane = new FeatureTree(argTreeModel); JPanel buttonPane = new JPanel();
JButton btnAdd = new JButton("添加");
JButton btnDelete = new JButton("删除");
JButton btnClear = new JButton("清空"); MyActionListener actionListener = new MyActionListener();
btnAdd.addActionListener(actionListener);
btnDelete.addActionListener(actionListener);
btnClear.addActionListener(actionListener); buttonPane.add(btnAdd);
buttonPane.add(btnDelete);
buttonPane.add(btnClear); treeEditPane.setLayout(new BorderLayout());
treeEditPane.add(treePane, BorderLayout.CENTER);
treeEditPane.add(buttonPane, BorderLayout.SOUTH);

} /**
 * 初始化“按钮区”的内容,并为按钮添加事件监听器
 * 
 */
private void initButtonView() { JButton btnExportTree = new JButton("保存特征树");
JButton btnImportTree = new JButton("导入特征树");
JButton btnOpinionFile = new JButton("选择评论文件");
JButton btnResultFile = new JButton("结果输出到");
JRadioButton wekaModel = new JRadioButton("WEKA", true);
JRadioButton svmModel = new JRadioButton("SVM", true);
JButton btnOk = new JButton("确定");
JButton btnConcle = new JButton("取消"); // 添加事件监听器
MyActionListener myListener = new MyActionListener();
btnExportTree.addActionListener(myListener);
btnImportTree.addActionListener(myListener);
btnOpinionFile.addActionListener(myListener);
btnResultFile.addActionListener(myListener);
btnOk.addActionListener(myListener);
btnConcle.addActionListener(myListener); ButtonGroup bGroup = new ButtonGroup();
bGroup.add(wekaModel);
bGroup.add(svmModel); buttonPane.setLayout(new GridLayout(2, 4));
buttonPane.add(btnExportTree);
buttonPane.add(btnImportTree);
buttonPane.add(btnOpinionFile);
buttonPane.add(btnResultFile);
buttonPane.add(wekaModel);
buttonPane.add(svmModel);
buttonPane.add(btnOk);
buttonPane.add(btnConcle);
} /**
 * 事件监听的内部类
 * 
 * @author Administrator
 * 
 */
private class MyActionListener implements ActionListener { public void actionPerformed(ActionEvent e) { String actionCommand = e.getActionCommand();
if (("保存特征树").equals(actionCommand)) {
JFileChooser fc = new JFileChooser();
fc.setDialogTitle("保存特征树到");
int returnVal = fc.showOpenDialog(frame); if (returnVal == JFileChooser.APPROVE_OPTION) {
File file = fc.getSelectedFile();
savePath = file.getPath(); boolean isSaveSuccess = treePane.saveTree(savePath); if (isSaveSuccess) {
JOptionPane.showMessageDialog(frame, "保存特征树成功");
} else {
JOptionPane.showMessageDialog(frame, "保存特征树失败");
}
}
} else if (("导入特征树").equals(actionCommand)) {
JFileChooser fc = new JFileChooser();
fc.setDialogTitle("导入特征树");
int returnVal = fc.showOpenDialog(frame); if (returnVal == JFileChooser.APPROVE_OPTION) {
File file = fc.getSelectedFile();
loadPath = file.getPath();
DefaultTreeModel treeModel = treePane.loadTree(loadPath);

if (treeModel!=null) {
initTreeView(treeModel);
JOptionPane.showMessageDialog(frame, "加载特征树成功");
} else {
JOptionPane.showMessageDialog(frame, "加载特征树失败");
}
} } else if (("选择评论文件").equals(actionCommand)) { JFileChooser fc = new JFileChooser();
fc.setDialogTitle("选择评论文件");
int returnVal = fc.showOpenDialog(frame); if (returnVal == JFileChooser.APPROVE_OPTION) {
File file = fc.getSelectedFile();
opinionPath = file.getPath();
}
} else if (("结果输出到").equals(actionCommand)) {
JFileChooser fc = new JFileChooser();
fc.setDialogTitle("结果输出到");
int returnVal = fc.showOpenDialog(frame); if (returnVal == JFileChooser.APPROVE_OPTION) {
File file = fc.getSelectedFile();
resultPath = file.getPath();
}
} else if (("确定").equals(actionCommand)) { } else if ("取消".equals(actionCommand)) {
frame.dispose();
System.exit(0);
} else if ("添加".equals(actionCommand)) { // 为树添加一个节点
treePane.addObject((newNodeIndex++) + "name,0.###");
} else if ("删除".equals(actionCommand)) { // 删除树的一个节点
treePane.removeCurrentNode();
} else if ("清空".equals(actionCommand)) { // 清空树的节点
treePane.clear();
}
}
} /**
 * 创建并显示窗口
 * 
 */
public static void createAndShowGUI() {
// 设置窗口样式
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception e) {
System.out.println("设置窗口样式出错");
e.printStackTrace();
} frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); MainFrame contentPane = new MainFrame();
contentPane.setOpaque(true);
frame.setContentPane(contentPane); // 设置窗口大小,显示窗口
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
} public static void main(String args[]) {
javax.swing.SwingUtilities.invokeLater(new Runnable() { public void run() {
createAndShowGUI();
}
});
}
}

解决方案 »

  1.   

    package swing;import java.awt.GridLayout;
    import java.awt.Toolkit;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.ObjectInputStream;
    import java.io.ObjectOutputStream;import javax.swing.Icon;
    import javax.swing.JPanel;
    import javax.swing.JTree;
    import javax.swing.event.TreeModelEvent;
    import javax.swing.event.TreeModelListener;
    import javax.swing.tree.DefaultMutableTreeNode;
    import javax.swing.tree.DefaultTreeCellRenderer;
    import javax.swing.tree.DefaultTreeModel;
    import javax.swing.tree.MutableTreeNode;
    import javax.swing.tree.TreePath;
    import javax.swing.tree.TreeSelectionModel;/**
     * 设置特征树的样式(没有图标,单选)
     * 
     * @author Administrator
     * 
     */
    public class FeatureTree extends JPanel { /**
     * 
     */
    private static final long serialVersionUID = 1L; protected DefaultMutableTreeNode rootNode; protected DefaultTreeModel treeModel=null; protected JTree tree; private Toolkit toolkit = Toolkit.getDefaultToolkit(); public FeatureTree(DefaultTreeModel argTreeModel) { super(new GridLayout(1, 0));

    if(argTreeModel==null)
    {
    rootNode = new DefaultMutableTreeNode("Root");
    this.treeModel = new DefaultTreeModel(rootNode);
    this.treeModel.addTreeModelListener(new MyTreeModelListener());
    }
    else
    {
    this.treeModel=argTreeModel;
    }
    tree = new JTree(treeModel);
    tree.setEditable(true);
    tree.getSelectionModel().setSelectionMode(
    TreeSelectionModel.SINGLE_TREE_SELECTION);
    tree.setShowsRootHandles(true); DefaultTreeCellRenderer renderer = new DefaultTreeCellRenderer();
    Icon personIcon = null;
    renderer.setLeafIcon(personIcon);
    renderer.setClosedIcon(personIcon);
    renderer.setOpenIcon(personIcon);
    tree.setCellRenderer(renderer);

    add(tree); } public void clear() {
    rootNode.removeAllChildren();
    treeModel.reload();
    } public void removeCurrentNode() {
    TreePath currentSelection = tree.getSelectionPath();
    if (currentSelection != null) {
    DefaultMutableTreeNode currentNode = (DefaultMutableTreeNode) (currentSelection
    .getLastPathComponent());
    MutableTreeNode parent = (MutableTreeNode) (currentNode.getParent());
    if (parent != null) {
    treeModel.removeNodeFromParent(currentNode);
    return;
    }
    } // Either there was no selection, or the root was selected.
    toolkit.beep();
    } public DefaultMutableTreeNode addObject(Object child) {
    DefaultMutableTreeNode parentNode = null;
    TreePath parentPath = tree.getSelectionPath(); if (parentPath == null) {
    parentNode = rootNode;
    } else {
    parentNode = (DefaultMutableTreeNode) (parentPath
    .getLastPathComponent());
    } return addObject(parentNode, child, true);
    } public DefaultMutableTreeNode addObject(DefaultMutableTreeNode parent,
    Object child) {
    return addObject(parent, child, false);
    } public DefaultMutableTreeNode addObject(DefaultMutableTreeNode parent,
    Object child, boolean shouldBeVisible) {
    DefaultMutableTreeNode childNode = new DefaultMutableTreeNode(child); if (parent == null) {
    parent = rootNode;
    } // It is key to invoke this on the TreeModel, and NOT
    // DefaultMutableTreeNode
    treeModel.insertNodeInto(childNode, parent, parent.getChildCount()); // Make sure the user can see the lovely new node.
    if (shouldBeVisible) {
    tree.scrollPathToVisible(new TreePath(childNode.getPath()));
    }
    return childNode;
    }

     
    public boolean saveTree(String savePath)
    {
    try{
    ObjectOutputStream oos1=new ObjectOutputStream(new FileOutputStream(savePath));
    oos1.writeObject(treeModel);
    oos1.close();
    }catch(Exception e)
    {
    return false;
    }
    return true;

    } public DefaultTreeModel loadTree(String loadPath)
    {
    ObjectInputStream ois;
    treeModel=null;
    try {
    ois = new ObjectInputStream(new FileInputStream(loadPath));
    treeModel=(DefaultTreeModel) ois.readObject();
    ois.close();
    } catch (Exception e) {
    e.printStackTrace();
    }
    return treeModel;
    }
    class MyTreeModelListener implements TreeModelListener {
    public void treeNodesChanged(TreeModelEvent e) {
    DefaultMutableTreeNode node;
    node = (DefaultMutableTreeNode) (e.getTreePath()
    .getLastPathComponent()); /*
     * If the event lists children, then the changed node is the child
     * of the node we've already gotten. Otherwise, the changed node and
     * the specified node are the same.
     */ int index = e.getChildIndices()[0];
    node = (DefaultMutableTreeNode) (node.getChildAt(index)); System.out.println("The user has finished editing the node.");
    System.out.println("New value: " + node.getUserObject());
    } public void treeNodesInserted(TreeModelEvent e) {
    } public void treeNodesRemoved(TreeModelEvent e) {
    } public void treeStructureChanged(TreeModelEvent e) {
    }
    }

    }
      

  2.   

    好像序列化的时候需要实现Serilize接口的吧
    您确定实现了?
    对不起单词拼写错误了,呵呵
      

  3.   

    实现了,swing控件已经实现了的
      

  4.   

    啊,回去又胡乱试了试突然成功了。
    TreeModel序列化输入后,调用了一次tree.setModel(treeModel);想要结果就出来了。
    正确代码明天发,今天没带来。