저는 작업중인 프로젝트의 채팅 부분에 대한 간단한 GUI를 만들고 있습니다. 나는 대화를위한 대화 창을 만들고 싶다. 그러나 몇 가지 이유로 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);
제거 f
static
을하고 UDPCS1
스레드 (초기 프로그램) 내에서 f.setVisible(true);
전화는 하나의 채팅 창이 나타나는 문제를 해결하기 위해 보인다 클라이언트와 서버가 모두 통신합니다. 그러나이 작업을 수행하는 데 오류가 발생하기 쉽고/덜한 방법이 있어야합니다. 나는 여전히 모든 대답과 의견을 기다리고있을 것이다. ...
을 –
다시 말해 보겠습니다. 저는 서버와 클라이언트 모두가 액세스 할 수있는 채팅 창 (채팅 개체)을 만들려고했습니다. 나는 서버와 클라이언트 모두에 대해 동일 할 것이기 때문에 정적을 추가 했으므로 동일한 채팅에 추가 할 것이기 때문에 정적을 추가했습니다. 이 생각에 결함이 있습니까? 편집 : 귀하의 수정 사항을 기록했습니다. 내 코드를 좀 더 자세히 살펴보고 좀 더 구체적인 것을 생각해 낼 수 있는지 알아 보겠습니다. 사과주세요! – user991710
대단히 그렇습니다. 정확한 참조를 전달할 때 정적 인 것을 사용하고 싶지는 않습니다. –