【发布时间】:2013-07-23 15:44:28
【问题描述】:
我正在为我正在处理的项目的聊天部分制作一个简单的 GUI。我希望为对话创建一个聊天窗口,但由于某种原因,每次运行调用线程的 main 方法时,都会弹出 2 个额外的窗口(我假设每个 thread 有 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();
}
}
我的服务器和客户端都扩展了这个class,然后在他们希望输出到聊天窗口时调用getChat().display(String s)。然而,与此同时,我得到了 3 个初始聊天窗口(可能正是 因为我扩展了它)。但是,我确实需要这个类的一些功能,所以我需要它成为一个超类。在没有 3 个聊天窗口的情况下,我能做些什么来保持整体功能不变?
附言。我意识到使用静态变量被视为一种严重的罪过,但我真的想不出任何其他方法让客户端和服务器都可以轻松访问这些变量。也欢迎提出改进方法的建议。
编辑:从UDPCS1 构造函数中删除f.setVisible(true);,生成fstatic,然后从UDPCS1 线程(初始程序)中调用f.setVisible(true);似乎解决了这个问题,因为只出现一个聊天窗口并且客户端和服务器都与之通信。但是,我确信必须有更好/更不容易出错/更清洁的方法来做到这一点。我仍然在等待任何答案和 cmets。
【问题讨论】:
-
“创建一个静态聊天对象”是什么意思?如果您的意思是使用静态变量或单例,请不要这样做。否则,我认为你会想要对你的代码进行一些试验,如果只是为了让你能够就这个主题提出更具体的问题。对于“任何建议”类型的问题,这不是一个很好的网站,而更像是一个特定问题特定解决方案类型的网站。
-
让我改写一下:我的意思是创建一个服务器和客户端都可以访问的聊天窗口(聊天对象)。我添加了静态,因为它对于服务器和客户端都是相同的,因此它们会添加到同一个聊天中。这种想法有缺陷吗?编辑:我注意到你的编辑。我会再检查一下我的代码,看看我能不能想出更具体的东西。我很抱歉!
-
非常如此。当简单地传递一个正确的引用时,你永远不想使用静态的任何东西。
-
供参考,有一个完整的例子here。
-
@trashgod 非常感谢这个例子,它对我帮助很大。 @HovercraftFullOfEels 我已经更新了这个问题,使其与我现在特别想做的事情更相关。我只是希望我对
static的无能不要踩到任何脚趾......
标签: java swing client-server chat