日期:2014-05-20  浏览次数:20707 次

java swing 部件序列化输入后不能刷新的问题,大家帮忙看看
我在界面中有一个JTree,构造一个树后,把它序列化输出,当序列化输入的时候却得不到原来的树了,我想是不是哪个地方没有被重画?大家帮我看一看。
一共是两个类。
Java code

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();
            }
        });
    }
}