2013-07-23 2 views
0

저는 작업중인 프로젝트의 채팅 부분에 대한 간단한 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); 제거 fstatic을하고 UDPCS1 스레드 (초기 프로그램) 내에서 f.setVisible(true); 전화는 하나의 채팅 창이 나타나는 문제를 해결하기 위해 보인다 클라이언트와 서버가 모두 통신합니다. 그러나이 작업을 수행하는 데 오류가 발생하기 쉽고/덜한 방법이 있어야합니다. 나는 여전히 모든 대답과 의견을 기다리고있을 것이다. ...

, 내가 너무 일을 한 내 경우에는 도왔 ... 가 도움이 희망 ...

+0

을 –

+0

다시 말해 보겠습니다. 저는 서버와 클라이언트 모두가 액세스 할 수있는 채팅 창 (채팅 개체)을 만들려고했습니다. 나는 서버와 클라이언트 모두에 대해 동일 할 것이기 때문에 정적을 추가 했으므로 동일한 채팅에 추가 할 것이기 때문에 정적을 추가했습니다. 이 생각에 결함이 있습니까? 편집 : 귀하의 수정 사항을 기록했습니다. 내 코드를 좀 더 자세히 살펴보고 좀 더 구체적인 것을 생각해 낼 수 있는지 알아 보겠습니다. 사과주세요! – user991710

+0

대단히 그렇습니다. 정확한 참조를 전달할 때 정적 인 것을 사용하고 싶지는 않습니다. –

답변

0

그냥 private static UDPCS1 chat = new UDPCS1();에서 static 키워드를 제거하고 더 이상 채팅 창은 없을 것입니다 무엇 "** 정적 ** 채팅 개체 만들기"를 의미합니까? 당신이 정적 변수 또는 싱글 톤을 사용한다는 것을 의미한다면, 이것을하지 마십시오. 그렇지 않으면,이 주제에 대해 더 구체적인 질문을 할 수있게하려면 코드를 실험 해보고 싶다고 생각합니다. 이것은 "모든 제안"유형 질문에 대한 훌륭한 사이트가 아니며 특정 솔루션 유형 사이트에 대한 구체적인 질문입니다.