以下这个类是一个主程序,里面有一个树:
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();
}
}
}
}
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();
}
}
}
}
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)