我正在为我正在处理的项目的聊天部分制作一个简单的 GUI。我希望为对话创建一个聊天窗口,但由于某种原因,thread
每次运行调用线程的 main 方法时,都会弹出 2 个额外的窗口(我假设每个窗口 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();
}
}
我的服务器和客户端都扩展了 this class
,然后getChat().display(String s)
在他们希望输出到聊天窗口时调用。然而,与此同时,我得到了 3 个初始聊天窗口(可能正是因为我扩展了它)。但是,我确实需要这个类的一些功能,所以我需要它成为一个超类。在没有 3 个聊天窗口的情况下,我能做些什么来保持整体功能不变?
PS。我意识到使用静态变量被视为一种严重的罪过,但我真的想不出任何其他方法让客户端和服务器都可以轻松访问这些变量。关于改进方法的建议也很受欢迎。
编辑f.setVisible(true);
:从构造函数中删除UDPCS1
,制作f
static
,然后f.setVisible(true);
从UDPCS1
线程(初始程序)中调用似乎可以解决问题,因为只出现一个聊天窗口并且客户端和服务器都与之通信。但是,我确信必须有更好/更不容易出错/更清洁的方法来做到这一点。我仍然会等待任何答案和评论。