2012-01-09 48 views
0

我有一个小问题 - 我有一个线程聊天客户端,为此我想创建一个警报(嘟嘟声)。只要窗口不在焦点并收到消息,警报就会被触发。现在,我只是试图显示一条消息,无论焦点状态如何。如果这样做,我可以用Toolkit.getDefaultToolkit().beep();替换打印语句。在线程内使用isFocused()时出错?

public class IncomingReader implements Runnable { 
    public void run() { 
     String message; 
     Font font = new Font("Verdana", Font.BOLD, 11); 
     JTarea.setFont(font); 
     try { 
     while ((message = reader.readLine()) != null) { 
      //checkFocus(); 
      if (Jfrm.isFocused()) { 
       System.out.println("focused"); 
      } else { 
       System.out.println("not focused"); 
      } 
      JTarea.append(message + "\n"); 

     } 
     } catch (Exception ex) { 
     System.out.println("errror run()"); 
     ex.printStackTrace(); 
     } 

    } 
} 

现在,每当我这样做,否则,我创建相同的代码checkFocus()一个函数,编译器是给我一个

java.lang.NullPointerException 
at ChatClient$IncomingReader.run(ChatClient.java:284) 
at java.lang.Thread.run(Unknown Source) 

我没有任何想法,为什么这种情况正在发生并希望得到任何帮助。 谢谢。

+0

ChatClient.java的第284行是什么?这是您可能在空对象上调用方法的地方。另外:您不可以在后台线程中使用Swing组件。所有Swing组件必须从EDT访问。阅读http://docs.oracle.com/javase/6/docs/api/javax/swing/package-summary.html#threading – 2012-01-09 18:55:08

+0

代码中引用的变量之一是null。最好的办法是使用调试器来找出哪一个。 – Perception 2012-01-09 18:57:13

+0

284行是if语句,它是检查isFocused()..谢谢你的建议,我不知道,会改变这一点,我认为这就是为什么我得到这么多的错误,当我改变一个小代码在run()方法。 Thnks – Nikhar 2012-01-09 18:58:48

回答

1

目的Jfrm(JFrame中):

if(Jfrm.isFocused()) 

null可能。

在调用方法之前,确保您确实拥有一个有效的对象。

+0

你可以详细说明一下。为什么在线程中出现这个错误,我查了一下isFocused为一个单独的简单java程序中的while循环窗口。它运行良好。 – Nikhar 2012-01-09 19:02:25