Java Swing聊天窗口创建额外的聊天窗口

Java Swing聊天窗口创建额外的聊天窗口,java,swing,client-server,chat,Java,Swing,Client Server,Chat,我正在为我正在进行的项目的聊天部分制作一个简单的GUI。我希望为对话创建一个聊天窗口,但由于某种原因,每次运行调用线程的main方法时,都会弹出两个额外的窗口(我假设每个线程1个) 到目前为止,我有以下几点: package udpcs1; import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import jav

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

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

   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();
      }
  }
我的服务器和客户端都扩展了这个
,然后调用
getChat()。当它们希望输出到聊天窗口时,显示(字符串)
。然而,同时,我得到了3个初始聊天窗口(可能正是因为我扩展了它)。然而,我确实需要这个类的一些功能,所以我需要它成为一个超类。在没有3个聊天窗口的情况下,如何保持整体功能不变

另外,我意识到使用静态变量被视为一种严重的罪恶,但我真的想不出任何其他方法让客户机和服务器都可以轻松访问这些变量。关于如何改进的建议也是最受欢迎的



编辑:删除
f.setVisible(true)
UDPCS1
构造函数中,使
f
static
,然后调用
f.setVisible(true)UDPCS1
线程(初始程序)中的code>似乎可以解决这个问题,因为只有一个聊天窗口出现,客户端和服务器都与之通信。然而,我相信一定有更好/更少出错/更干净的方法来做到这一点。我仍将等待任何答案和评论。

只需从
私有静态UDPCS1 chat=new UDPCS1()中删除
static
关键字即可将不再有聊天窗口。。。 希望能有帮助


在我的情况下,我也在做一些事情,…

你说的“创建静态聊天对象”是什么意思?如果您的意思是使用静态变量或单例,那么不要这样做。否则,我认为您可能会想尝试一下您的代码,哪怕只是为了让您能够在这个主题上提出更具体的问题。对于“任何建议”类型的问题,这不是一个很好的站点,但更像是一个特定于问题的解决方案类型的站点。让我重新表述一下:我的意思是创建一个聊天窗口(聊天对象),服务器和客户端都可以访问该窗口。我添加了static,因为它对于服务器和客户端都是相同的,因此它们将添加到同一个聊天中。这种想法有缺陷吗?编辑:我注意到你的编辑。我“我会再检查一下我的代码,看看是否能想出更具体的东西。我道歉!非常感谢。当只传递一个正确的引用时,你永远不想使用静态的任何东西。对于引用,这里有一个完整的例子。@trashgood非常感谢你的例子,它对我帮助很大@HovercraftFullOfEels我已经更新了这个问题,使之与我现在特别想做的事情更加相关。我只是希望我不会因为自己在
静态方面的无能而触怒任何人。。。