2013-11-28 2 views
0

채팅 클라이언트를 만들고 있지만 실행되지 않는 코드에 문제가 있습니다. "gui.list2.setVisible (참)"와 "gui.list2.setText ("TestText ")"일부 코드 줄 실행 안 함

public static void login(String userName, String password) throws XMPPException { 

    ConnectionConfiguration config = new ConnectionConfiguration("chat.facebook.com",5222,"Work"); 
    connection = new XMPPConnection(config); 

    try{ 
     connection.connect(); 
     connection.login(userName, password); 
     System.out.println("Login Successful"); 
     //gui.removeAll(); 

     URL temp = start.class.getResource("slate.png"); 

     gui.window.remove(gui.password); 
     gui.window.remove(gui.username); 
     gui.window.remove(gui.login); 
     gui.window.remove(gui.failed); 
     gui.window.setContentPane(new JLabel(new ImageIcon(temp))); 
     gui.window.setBackground(new Color(27,27,27)); 

     System.out.println("Reached 1"); 
     //displayBuddyList(); 
     gui.list2.setVisible(true); 
     System.out.println("Reached 2"); 
     gui.list2.setText("text test"); 
     System.out.println("Reached 3"); 

    } 
    catch(Exception e){ 
     gui.failed.setVisible(true); 
    } 


} 

라인 솔기가 작동하지합니다. 그러나 나는 System.out.println 메시지를 모두 얻는다.

"리스트 2"인 JTextArea에가, 그 있었다 adready 내가 사용하고 JFrame에 추가 : Heres는 내 GUI 클래스의 코드 :

window.add(list2); 
list2.setBounds(0,0,window.getWidth(),window.getHeight()); 
list2.setVisible(false); 

추가 조사에 대한 모든 코드 : http://pastebin.com/PcSPzgBN

+1

이 모든 것이 EDT에서 발생합니까? 그렇다면 EDT에 방해가되는 다른 것이 있습니까? – John3136

+0

put gui.list2.setVisible (true); * setText 호출 후 *. – Sinkingpoint

+0

@Quirliom 그게 작동하지 않습니다. – DarkLlama

답변

1

소스 코드가 너무 길어서 인용 한 문제의 정확한 위치를 정확히 찾아 낼 수 없습니다. 나는 그것이 정확히이 줄 수 있다고 생각 : 컨텐츠 구획을 설정 한 후, list2 더 이상 프레임에 아마하지

gui.window.setContentPane(new JLabel(new ImageIcon(temp))); // <- this line 
gui.window.setBackground(new Color(27,27,27)); 

... 
gui.list2.setText("text test"); 
... 
gui.list2.setVisible(true); 

. 아마 콘텐츠 창 ( gui.firstscreen?) 이전의 내용 일 것입니다.

그러나 더 일반적인 문제가 있습니다.

SomeJComponent aComp1 = new SomeJComponent(); 

somewhere.add(aComp1); 
aComp1.setBounds(/* ... */); 
aComp1.setVisible(false); 

SomeJComponent aComp2 = new SomeJComponent(); 

somewhere.add(aComp2); 
aComp2.setBounds(/* ... */); 
aComp2.setVisible(false); 

은 기본적으로 당신이 동적으로 때때로 프레임에 보이는 구성 요소를 전환 할 이러는과 같습니다

나는이처럼 보이는 패턴을 참조하십시오. 구성 요소가 모두 겹치고 프레임을 재구성하기 위해 표시 할 구성 요소를 선택합니다. 이렇게하는 것을 강력히 권합니다.

컨테이너의보기를 전환하는 "올바른"방법은 별도의 패널을 가지고 콘텐츠 창을 설정하거나 JTabbedPane과 같은 JComponent를 더 잘 사용하는 것입니다. 다음은 그냥이하는 짧은 작업 예이다 : 당신이 어떤 GUI 요소를 공유하고자 할 경우

import javax.swing.SwingUtilities; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JButton; 

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import java.awt.BorderLayout; 

public class PanelSwap { 
    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new PanelSwap().frame.setVisible(true); 
      } 
     }); 
    } 

    JFrame frame; 
    JPanel panel1; 
    JPanel panel2; 

    PanelSwap() { 

     frame = new JFrame(); 
     frame.setLocationRelativeTo(null); 

     panel1 = new JPanel(new BorderLayout()); 

     JButton toPanel2 = new JButton("Goto Panel 2"); 
     toPanel2.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       frame.setContentPane(panel2); 
       frame.validate(); 
      } 
     }); 

     panel1.add(toPanel2, BorderLayout.CENTER); 

     panel2 = new JPanel(new BorderLayout()); 

     JButton toPanel1 = new JButton("Goto Panel 1"); 
     toPanel1.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       frame.setContentPane(panel1); 
       frame.validate(); 
      } 
     }); 

     panel2.add(toPanel1, BorderLayout.CENTER); 

     frame.setContentPane(panel1); 
     frame.pack(); 
    } 
} 

, 대신 공유 요소 패널에 컨텐츠 구획을 설정하고 추가 /에 요소를 제거 할 수 있습니다/그 패널에서. 최상의 결과를 얻으려면 BorderLayout과 같은 것을 사용하십시오.

다른 점은 Event Dispatch Thread에서 GUI와 상호 작용해야한다는 것입니다. 튜토리얼은 Concurrency in Swing을 참조하십시오. 특히 "초기 스레드""The Event Dispatch Thread".

이것이 바로 invokeLater입니다. 이벤트 (예 : actionPerformed과 같은) 내부의 GUI는 EDT에서 실행되므로 GUI를 업데이트하는 것이 좋습니다. 다른 곳에서는 invokeLater을 사용해야합니다. 규칙에는 몇 가지 예외가 있지만 대부분 EDT에서 스윙을해야합니다.

마지막으로 더 많은 것은 제쳐두고 Java code conventions을 따라야합니다. 특히 클래스는 대문자로 시작해야합니다. startgui 클래스는 StartGUI이어야합니다.gui 클래스에 start이라는 메서드가 있기 때문에 더 혼란 스럽습니다.

+0

감사!! 나는 그 블록에서'gui.window.add (gui.list2)'를 추가한다고 생각하지 않는다. 나는 곧 내 코드를 다시 작성하는 것에 집중하려고 노력할 것이다. 문제가 생기면 메시지를 보낼 수 있습니까? – DarkLlama

+0

채팅을 사용하기에 충분한 담당자가 있다고 생각하기 때문에 나를 거기서 우박으로 보려고 할 수 있습니다. @ (@DarkLlama와 같은)를 사용하여 사용자 이름을 입력하면 채팅에서 언급 알림을 보내 게됩니다. 내가 그렇게하지 않는다면 어쨌든 질문 할 수 있습니다. 때로는 방 안에 다른 사람이 있거나 내가 탔을 때 보게 될 수도 있습니다. – Radiodef

0

을 구성 요소를 가시로 설정 한 후 gui 컨테이너 (창) 또는 JTextArea 구성 요소를 다시 채우고 (다시) 검증하십시오.

+0

like'window.repaint()'JFrame 및 JTextArea에서 해당 메소드를 시도했습니다 – DarkLlama