2013-07-23 87 views
0

我正在为我正在处理的项目的聊天部分制作一个简单的GUI。我希望为对话创建一个聊天窗口,但由于某种原因,每次运行调用线程的主要方法时,都会弹出两个额外的窗口(每个为thread,我假设每个都会弹出一个窗口)。摆动聊天窗口创建额外的聊天窗口

到目前为止,我有以下几点:

package udpcs1; 

    import java.awt.BorderLayout; 
    import java.awt.event.ActionEvent; 
    import java.awt.event.ActionListener; 
    import javax.swing.JButton; 
    import javax.swing.JFrame; 
    import javax.swing.JScrollPane; 
    import javax.swing.JTextArea; 
    import javax.swing.JTextField; 

    public class UDPCS1 implements ActionListener { 

     private static String csMsg1 = ""; 
     private static int played = 0; 
     private static UDPCS1 chat = new UDPCS1(); 
     private final JFrame f = new JFrame(); 
     private final JTextField tf = new JTextField(60); 
     private final JTextArea textArea = new JTextArea(10, 60); 
     private final JButton send = new JButton("Send"); 

     protected String[] message = { ... }; 

     protected String[] rps = { ... }; 

     public UDPCS1() { 
      f.setTitle("Chat"); 
      f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      f.getRootPane().setDefaultButton(send); 
      f.add(tf, BorderLayout.NORTH); 
      f.add(new JScrollPane(textArea), BorderLayout.CENTER); 
      f.add(send, BorderLayout.SOUTH); 
      f.setLocation(400, 300); 
      f.pack(); 
      send.addActionListener(this); 
      textArea.setLineWrap(true); 
      textArea.setWrapStyleWord(true); 
      f.setVisible(true); 
     } 

     @Override 
     public void actionPerformed(ActionEvent event) { 
      String msg = tf.getText(); 
      display(msg); 
      tf.setText(""); 
     } 

     // Server/client thread already synchronize their output, so only need to display it 
     protected void display(final String s){ 
        textArea.append(s + "\n"); 
     } 

     protected UDPCS1 getChat() { 
        return chat; 
     } 

     // get/set methods for some intra-host communication 
     protected String getMsg() { ... } 
     protected void setMsg(String newMsg) { ... } 
     protected int getNum() { ... } 
     protected void incNum() { ... } 

     public static void main(String[] args) throws Exception { 
     // Start the first server-client pair 
     UDPServer1 server1 = new UDPServer1(); 
     UDPClient1 client1 = new UDPClient1(); 
     } 
    } 

我的服务器和客户端扩展此class,然后调用getChat().display(String s)当他们想输出到聊天窗口。但是,与此同时,我得到3个最初的聊天窗口(可能确切地说是,因为我扩展了它)。但是,我确实需要这个类的一些功能,所以我需要它成为一个超类。我能做些什么来保持整体功能不变,而不需要3个聊天窗口?

PS。我意识到使用静态变量被认为是一个严重的罪过,但我无法找到任何其他方式让这些变量可以轻松地被客户端和服务器访问。有关如何改善这一点的建议也非常受欢迎。


编辑:从UDPCS1构造函数中删除f.setVisible(true);,使得fstatic,然后从UDPCS1线程(初始程序)中调用f.setVisible(true);似乎解决了问题,因为只出现一个聊天窗口,客户端和服务器都与它进行通信。但是,我确信必须有更好/更少的容易出错/更简洁的方式来执行此操作。我仍然在等待任何答案和评论。

+0

什么你的意思是“创建一个**静态**聊天对象”?如果你的意思是使用静态变量或单例,那么不要这样做。否则,我认为你会想对你的代码进行一些实验,只是为了让你能够对这个主题提出更具体的问题。对于“任何建议”类型的问题,这不是一个很好的网站,而是更具体的问题特定解决方案类型网站。 –

+0

让我改述一下:我的意思是创建一个聊天窗口(聊天对象),服务器和客户端都可以访问。我添加了静态,因为它对于服务器和客户端都是一样的,因此它们会添加到同一个聊天中。这种想法是否有缺陷? 编辑:我记下你的编辑。我会继续检查我的代码,看看我能否提出更具体的内容。我的歉意! – user991710

+0

非常非常,当你传递一个正确的参考时,你永远都不想使用静态的东西 –

回答

0

刚刚从private static UDPCS1 chat = new UDPCS1();删除static关键字并没有更多的聊天窗口将在那里...... 希望能帮助它...

帮助了我的情况下,我在做的东西太多,...