我现在做QQ, 但是一个控制台里面同时打开两个QQ的 时候,只有一个能用,剩下的一个是 白板,  求救, 另外,
点击我的好友的时候出现错误:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
即:
DefaultMutableTreeNode node = (DefaultMutableTreeNode) tree.getLastSelectedPathComponent();
说 node 是 null, 然后我很郁闷的求教了, 难道用复杂的多线程么?

解决方案 »

  1.   

    苍苍 老师呐, 我的帖子没人回, 又是 swing 线程问题, 送分了抢沙发
      

  2.   

    是的,但是tree.getLastSelectedPathComponent();这个根本 就没有正确获取到。。
      

  3.   

    import java.awt.BorderLayout;
    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的时候正常,求高人指点