2013-11-28 125 views
0

我正在創建一個聊天客戶端,但是我的代碼沒有運行時出現問題。某些行代碼不運行

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); 
    } 


} 

線 「gui.list2.setVisible(真)」 和 「gui.list2.setText(」 TestText 「)」 接縫被不工作。但是我得到了所有的System.out.println消息。

「列表2」 是一個JTextArea,其一直adready加入我一直使用JFrame: 繼承人在我的GUI類代碼:

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

爲了進一步調查的所有代碼:http://pastebin.com/PcSPzgBN

+1

所有這一切都發生在美國東部時間?如果是這樣,是否有其他東西干擾美國東部時間? – John3136

+0

把gui.list2.setVisible(true); *在setText調用之後。 – Sinkingpoint

+0

@Quirliom沒有工作。 – DarkLlama

回答

1

您的源代碼足夠長,以至於很難準確指出您引用的問題的確切位置。我想這可能正是這條線:

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); 

哪裏設置內容窗格後,list2可能不是在框架了。這可能是以前的內容窗格(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); 

基本上,它看起來像你這樣做是爲了動態切換,有時出了框架上的有形成分。你的組件都是重疊的,你選擇哪些組件可以重新配置框架。我強烈建議不要這樣做。

交換容器視圖的「正確」方法是使用單獨的面板並設置內容窗格(或者甚至更好地使用用於此的JComponents,例如JTabbedPane)。下面是一個簡短的工作的例子,做到了這一點:

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(); 
    } 
} 

如果你想分享一些GUI元素,可以改爲設置內容窗格中的面板與共享的元素,並添加/刪除元素/從那個小組。使用類似BorderLayout的東西來獲得最佳效果。

另一點是您需要與事件調度線程上的GUI進行交互。本教程請參閱Concurrency in Swing。具體爲「初始線程」「事件調度線程」

這就是invokeLater的用途。更新GUI內部事件(類似actionPerformed的方法)是可以的,因爲它們在EDT上執行。其他地方你應該使用invokeLater。規則有一些例外,但大多數情況下您需要在EDT上執行Swing操作。

最後一個更像是旁邊,你應該真的按照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