以下这个类是一个主程序,里面有一个树:
package com.convision.nms.swing;import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.tree.*;
import java.io.File;
import java.net.*;
import javax.swing.border.*;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.JTableHeader;
import javax.swing.table.TableColumnModel;
import javax.swing.table.TableModel;
import javax.swing.table.DefaultTableModel;
import javax.swing.plaf.metal.*;import com.convision.nms.comm.CommProcess;/**
 * <p>Title: </p>
 * <p>Description: </p>
 * <p>Copyright: Copyright (c) 2003</p>
 * <p>Company: </p>
 * @author 
 * @version 1.0
 */
public class MainFrame extends JFrame implements RefreshListener {
    private JScrollPane treeArea;
    private JTree jTree;    // 设备状态查询的线程
    private CommProcess commProcess;    /**
     * MainFrame构造函数
     */
    public MainFrame() {
        enableEvents(AWTEvent.WINDOW_EVENT_MASK);
        try {
            initGUI();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }    /**
     * 系统的主窗口初始化
     */
    private void initGUI()
        throws Exception {
        // 启动设备状态查询的线程
        commProcess = new CommProcess();
        this.setIconImage(CreateTitleImage.getIconImage(getClassName()));
        this.contentPane = (JPanel)this.getContentPane();
        this.contentPane.setLayout(new BorderLayout());
        this.show();
        this.setExtendedState(6);
        this.setTitle("网络管理系统");
        this.contentPane.setBorder(BorderFactory.createLineBorder(Color.white));
        this.setTreeArea();
        this.getContentPane().add(treeArea);
    }    /**
     * 关闭主窗口的事件
     */
    protected void processWindowEvent(WindowEvent e) {
        super.processWindowEvent(e);
        if (e.getID() == WindowEvent.WINDOW_CLOSING) {
            System.exit(0);
        }
    }    /**
     * 设置主窗口中的树
     */
    private void setTreeArea() {
        jTree = new JTree();
        TreeNodeDisa rootNode = new TreeNodeDisa("正在搜索设备、、、");
        rootNode.setCode("");
        rootNode.setName("正在搜索设备、、、");
        rootNode.setToolTipText("请稍候");
        rootNode.setIcon(MetalIconFactory.getTreeComputerIcon());        DefaultTreeModel model = new DefaultTreeModel(rootNode);
        jTree.setModel(model);        commProcess.setTree(jTree);
        commProcess.start();        /** 改变叶结点图标 */
        IconNodeRenderer render = new IconNodeRenderer();
        jTree.setCellRenderer(render);
        jTree.putClientProperty("JTree.icons", makeIcons());
        jTree.setCellRenderer(new IconNodeRenderer());
        jTree.addTreeSelectionListener(
            new TreeSelectionListener() {
            public void valueChanged(TreeSelectionEvent e) {
                jTree_valueChanged(e);
            }
        });        treeArea = new JScrollPane();
        treeArea.getViewport().add(jTree);
    }    /**
     * 返回字符串型的类名
     */
    private String getClassName() {
        String className = this.getClass().toString();
        try {
            int tmpi = className.indexOf(".");
            while (tmpi != -1) {
                className = className.substring(tmpi + 1);
                tmpi = className.indexOf(".");
            }
        } catch (Exception e) {
        }
        return className;
    }    /**
     * 树的选择事件
     * @param e
     */
    private void jTree_valueChanged(TreeSelectionEvent e) {
        DefaultMutableTreeNode node = (DefaultMutableTreeNode) jTree.
            getLastSelectedPathComponent();        TreePath pathnode = (TreePath) jTree.getLeadSelectionPath();
        if (jTree.isVisible(pathnode)) {
            String nodeName = (String) node.getUserObject();
            if (node.isRoot()) {
                mainArea.removeAll();
                mainArea.setLayout(new BorderLayout());
                StartPanel startPanel = new StartPanel();
                mainArea.add(startPanel, BorderLayout.CENTER);
                mainArea.updateUI();            } else if (node.isLeaf()) {
                mainArea.removeAll();
                mainArea.setLayout(null);
                IconNodeTreeFrame iconNode = new IconNodeTreeFrame(this);
                iconNode.setBounds(0, 0, 1000, 1000);
                mainArea.add(iconNode, null);
                mainArea.updateUI();
                DeviceStyle.setLastNode((String)node.getUserObject());
            } else {
                mainArea.removeAll();
                mainArea.setLayout(new BorderLayout());
                ImgPanel imgPanel = new ImgPanel(new BorderLayout());
                mainArea.add(imgPanel, BorderLayout.CENTER);
                mainArea.updateUI();
            }
        }
    }
}

解决方案 »

  1.   

    没看出错误来,不过可以提示你,你在run()开始给jTree加了太多的东西,是不是可以先注释掉一些来缩小错误范围?
      

  2.   

    我把这个线程类改成下面这样,那个错误还是会出现,是不是线程不能更新树啊?
    public class CommProcess extends Thread {
        private boolean bTimeFlag = true;
        // 定义一个网管系统管理所有IP地址的数组
        String[] allHost = {"192.168.0.12"};
        private JTree jTree;
        public CommProcess() {}
        public void setTree(JTree p_jTree){
              this.jTree = p_jTree;
        }
        public void run() {
            while (true) {
                if (jTree == null) {
                    return;
                }
                jTree.updateUI();
                try {
                    this.sleep(1000);
                } catch (InterruptedException ie) {
                    System.out.println("InterruptedException=="+ ie);
                }
             }
        }
    }
    但每次运行线程时,运行到jTree.updateUI();这条语句时出现下面奇怪的错误:
    Hit uncaught exception java.lang.NullPointerException
    java.lang.NullPointerException
    at javax.swing.plaf.basic.BasicTreeUI.paintRow(BasicTreeUI.java:1375)
    at javax.swing.plaf.basic.BasicTreeUI.paint(BasicTreeUI.java:1171)
    at javax.swing.plaf.ComponentUI.update(ComponentUI.java:142)
    at javax.swing.JComponent.paintComponent(JComponent.java:541)
    at javax.swing.JComponent.paint(JComponent.java:808)
    at javax.swing.JComponent.paintWithOffscreenBuffer(JComponent.java:4771)
    at javax.swing.JComponent.paintDoubleBuffered(JComponent.java:4724)
    at javax.swing.JComponent._paintImmediately(JComponent.java:4668)
    at javax.swing.JComponent.paintImmediately(JComponent.java:4477)
    at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:410)
    at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(SystemEventQueueUtilities.java:117)
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:178)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:448)
    at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:197)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:144)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:136)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:99)
      

  3.   

    Swing是线程不安全的,通常不建议在线程中更新Swing组件,一般是在线程中派发事件.简单的做法参考SwingUtilities.invokeLater()中的说明.
      

  4.   

    不要==null,把null作为一个字符串比较