私が取り組んでいるプロジェクトのチャット部分の簡単な GUI を作成しています。会話用のチャット ウィンドウを作成したいのですthread
が、スレッドを呼び出すメイン メソッドを実行するたびに、何らかの理由で 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。静的変数を使用することは重大な罪と見なされていることは理解していますが、これらの変数をクライアントとサーバーの両方から簡単にアクセスできるようにする方法は他にありませんでした。それを改善する方法についての提案も大歓迎です。
EDIT :コンストラクターf.setVisible(true);
内から削除し、作成してから、スレッド (初期プログラム) 内から呼び出すと、チャット ウィンドウが 1 つだけ表示され、クライアントとサーバーの両方がそれと通信するため、問題が解決するようです。ただし、これを行うには、より良い/エラーが発生しにくい/よりクリーンな方法が必要であると確信しています。私はまだ答えやコメントを待っています。UDPCS1
f
static
f.setVisible(true);
UDPCS1