2016-06-08 44 views
0

我有一個組合框,可以選擇一個人。選擇一個人之後,我想用一個提供我選擇的人的所有信息的新人改變我的活動JPanel。但是當我更改JPanel時,我收到一個IndexOutOfBoundsException。我是一個新手,但我總是認爲這個錯誤只出現在小數組?我做錯了什麼?添加新jpanel後IndexOutOfBound異常

我的第一類:

public void initGUI() { 
    comboBox1.removeAllItems(); 

    for (Person personi : listPerson) { 
     comboBox1.addItem(personi); 
    } 
    comboBox1.setSelectedIndex(-1); 

    comboBox1.addItemListener(e -> comboBox1Pressed(e)); 
    frame.setContentPane(mainPanel); 
    frame.repaint(); 
    frame.revalidate(); 
    frame.setVisible(true); 
} 

private void comboBox1Pressed(ItemEvent ie) { 
    if (ie.getStateChange() == ie.SELECTED) { 
     gui_Person.initGUI((Person) ie.getItem()); 
    } 
} 

我的第二個:

public void initGUI(Person person) { 
    frame.setContentPane(mainPanel); 
    frame.repaint(); 
    frame.revalidate(); 
    frame.setVisible(true); 
} 

第二類出現在此行中的錯誤:

frame.setContentPane(mainPanel); 

堆棧跟蹤:

Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: Index: 1, Size: 1 
at java.util.ArrayList.rangeCheck(ArrayList.java:653) 
at java.util.ArrayList.remove(ArrayList.java:492) 
at java.awt.Container.remove(Container.java:1217) 
at javax.swing.JLayeredPane.remove(JLayeredPane.java:246) 
at java.awt.Container.remove(Container.java:1262) 
at javax.swing.JRootPane.setContentPane(JRootPane.java:623) 
at javax.swing.JFrame.setContentPane(JFrame.java:698) 
at GUI_Person.initGUI(GUI_Person.java:45) 
at GUI_Person.initGUI(GUI_Person.java:45) 
at GUI_Main.comboBox1Pressed(GUI_Main.java:42) 
at GUI_Main.lambda$initGUI$0(GUI_Main.java:32) 
+0

*「我做了什麼錯?」 *例如省略堆棧跟蹤。 – Tom

+0

對不起,湯姆!我是Stack Overflow的新手,我忘記了。我會編輯它! – SovietPanda

+0

你的問題是這行'frame.setContentPane(mainPanel)',因爲Swing試圖從內部分層窗格中刪除以前的內容窗格,但該窗格只有1個項目,而不是兩個。要麼你在玩分層窗格,要麼Swing本身在這裏有問題。請嘗試創建[mcve],以便我們可以在本地重現您的問題。 – Tom

回答

1

的問題,首先刪除舊的面板解決,事後添加新的一個:

public void initGUI(Person person) { 
    frame.getContentPane().removeAll(); 
    frame.repaint(); 
    frame.revalidate(); 

    frame.setContentPane(mainPanel); 
    frame.repaint(); 
    frame.revalidate(); 
    frame.setVisible(true); 
} 
+2

如果要在之後立即設置內容窗格,則不應該需要第一個repaint()和revalidate()。如果你的框架還不可見,爲什麼要調用repaint()呢?你可能想調用frame.pack()而不是frame.revalidate()。 – FredK

+0

@FredK請注意,此代碼來自OP並從問題中提取。所以不要忘記在你的評論中加一個'@ SovietPanda'來問他,或者在這個問題下寫下這個評論:)。如果OP同意,然後隨時更新這個答案,以改善它:)(這就是爲什麼這個問題是一個社區維基)。 – Tom

+0

@FredK說實話,我也不知道它。現在我更喜歡「如果它有效,它有效」,而不是研究爲什麼你必須這樣做。我從另一個話題中找到了它的一部分,並從那裏複製了它。所以如果你有更好的建議,可以隨意編輯它。 – SovietPanda

相關問題