我现在做QQ, 但是一个控制台里面同时打开两个QQ的 时候,只有一个能用,剩下的一个是 白板, 求救, 另外,
点击我的好友的时候出现错误:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
即:
DefaultMutableTreeNode node = (DefaultMutableTreeNode) tree.getLastSelectedPathComponent();
说 node 是 null, 然后我很郁闷的求教了, 难道用复杂的多线程么?
import java.awt.GridLayout;import javax.swing.*;
import javax.swing.event.*;
import java.awt.event.*;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.TreePath;
import javax.swing.tree.TreeSelectionModel;public class MainFrame extends JFrame {
private int port;
protected DefaultMutableTreeNode root;
protected static DefaultMutableTreeNode friend;
protected static DefaultMutableTreeNode stranger;
private DefaultMutableTreeNode blacklist;
private JPanel panelCenter;
private boolean flag = true;
private ExecutorService es;
protected static JTree tree;
private JButton buttonAdd;
private JButton buttonUploading;
//就是QQ 对话框
private QQFace qqFace; private UDPReceive receive; public QQFace getQQFace() {
return qqFace;
} public MainFrame(String name, int port) {
super(name);
es = Executors.newCachedThreadPool();
this.port = port;
init();
setAction();
addFriend("wjj");
addFriend("you ");
// new QQTrayIcon(this);
receive = new UDPReceive(port); } public void stopInternalThread() {
flag = false;
treeFlag = false;
es.shutdown();
System.out.println("in stopInternalThread() ");
System.out.println("InternalThread is alive? " + es.isShutdown());
} public void init() { root = new DefaultMutableTreeNode("我的列表");
friend = new DefaultMutableTreeNode("我的好友");
stranger = new DefaultMutableTreeNode("陌生人");
blacklist = new DefaultMutableTreeNode("黑名单"); root.add(friend);
root.add(stranger);
root.add(blacklist); // System.out.println("wjjj "+root.getChildAt(1));
tree = new JTree(root);
tree.getSelectionModel().setSelectionMode(
TreeSelectionModel.SINGLE_TREE_SELECTION); JScrollPane scroll = new JScrollPane(tree); panelCenter = new JPanel();
panelCenter.setLayout(new BorderLayout());
panelCenter.add(tree, BorderLayout.CENTER); Box box = Box.createHorizontalBox();
buttonAdd = new JButton("新加 ");
box.add(buttonAdd);
buttonUploading = new JButton("上传文件");
box.add(buttonUploading); panelCenter.add(box, BorderLayout.SOUTH); add(panelCenter, BorderLayout.CENTER);
setVisible(true);
setBounds(200, 200, 200, 500);
// setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
} // /////接收传过来的消息的线程
private void initReceiveThread() { Runnable rReceive = new Runnable() { @Override
public void run() {
System.out.println("in initReceiveThread() ");
// TODO Auto-generated method stub
String tmp = null;
while (flag) {
String s = receive.getReceiveMessage(); // System.out.println("initReceiveThread() s is "+s); if (s != tmp && s != null) {
SimpleDateFormat sdf = new SimpleDateFormat(
"yyyy-mm-dd");
String time = sdf.format(new Date()) + " : \n";
qqFace.insertMessage(time);
qqFace.insertMessage(s + "\n");
tmp = s;
}
} } };
es.execute(rReceive);
} private void setAction() {
tree.addTreeSelectionListener(new TreeSelectionListener() { @Override
public void valueChanged(TreeSelectionEvent arg0) {
// TODO Auto-generated method stub
Runnable r = new Runnable(){ @Override
public void run() {
// TODO Auto-generated method stub
handleNode();
}
};
es.execute(r);
}
}); /*
tree.addMouseListener(new MouseAdapter(){
public void mouseClicked(MouseEvent e){
if(e.getClickCount() == 2){
DefaultMutableTreeNode node = (DefaultMutableTreeNode)e.getSource();
qqFace = new QQFace(node.toString(), port);
// System.out.println(" node "+node.toString());
initReceiveThread();
System.out.println("in set Action ");
}
}
});
*/
buttonAdd.addActionListener(new ActionListener() { @Override
public void actionPerformed(ActionEvent arg0) {
// TODO Auto-generated method stub
new AddPeople();
} });
buttonUploading.addActionListener(new ActionListener(){ @Override
public void actionPerformed(ActionEvent arg0) {
// TODO Auto-generated method stub
}
});
this.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
receive.stopReceive();
stopInternalThread();
System.exit(0);
}
});
}
private boolean treeFlag =true;
private void handleNode(){
/* TreePath selectionPath = tree.getSelectionPath();
DefaultMutableTreeNode node =
(DefaultMutableTreeNode) selectionPath .getLastPathComponent();
*/
DefaultMutableTreeNode node = (DefaultMutableTreeNode) tree.getLastSelectedPathComponent();
System.out.println("now thread is "+Thread.currentThread().getName());
try{
if (!node.isRoot()) {
if (friend.isNodeChild(node)) {
qqFace = new QQFace(node.toString(), port);
//
initReceiveThread();
System.out.println("in set Action "); }
}
}catch(NullPointerException e){
System.out.println("no node");
}
}
public UDPReceive getUDPReceive() {
return receive;
} public static void addFriend(String s) {
DefaultMutableTreeNode temp = new DefaultMutableTreeNode(s);
friend.add(temp); } public static void addStranger(String s) {
DefaultMutableTreeNode temp = new DefaultMutableTreeNode(s);
stranger.add(temp);
} public void addBlackList(String s) {
DefaultMutableTreeNode temp = new DefaultMutableTreeNode(s);
blacklist.add(temp);
}
/*
public static void main(String args[]) {
new MainFrame("佳佳", 4063);
// new QQTrayIcon(new MainFrame("佳佳"));
}
*/
}
在另一个类中这样调用public class Test{
public static void main(String args[]) {
System.out.println("****************** MAIN BEGIN*********");
// new CreateThread("A", 4163).start();
// new CreateThread("B", 4263).start();
MainFrame d = new MainFrame("A", 4163);
MainFrame ds = new MainFrame("B", 4263);
System.out.println("****************** MAIN END*********"); }
}
结果是 点击A的时候出现now thread is pool-1-thread-1 no node
点击B的时候正常,求高人指点