2012-11-23 15 views
12

Nie wiem, dlaczego ten błąd nadchodzi. Korzystam z GroupLayout, ponieważ chcę, aby robił dla mnie odstępy i będzie dodawał więcej paneli do ramki w przyszłości. Poniżej znajduje się ślad stosu.GroupLayout może być używany tylko z jednym kontem na raz.

Exception in thread "main" java.lang.IllegalArgumentException: GroupLayout can only be used with one Container at a time 
    at javax.swing.GroupLayout.checkParent(Unknown Source) 
    at javax.swing.GroupLayout.invalidateLayout(Unknown Source) 
    at java.awt.Container.invalidate(Unknown Source) 
    at java.awt.Component.addNotify(Unknown Source) 
    at java.awt.Container.addNotify(Unknown Source) 
    at javax.swing.JComponent.addNotify(Unknown Source) 
    at java.awt.Container.addNotify(Unknown Source) 
    at javax.swing.JComponent.addNotify(Unknown Source) 
    at java.awt.Container.addNotify(Unknown Source) 
    at javax.swing.JComponent.addNotify(Unknown Source) 
    at javax.swing.JRootPane.addNotify(Unknown Source) 
    at java.awt.Container.addNotify(Unknown Source) 
    at java.awt.Window.addNotify(Unknown Source) 
    at java.awt.Frame.addNotify(Unknown Source) 
    at java.awt.Window.pack(Unknown Source) 
    at client.AlternateGUI.drawGui(AlternateGUI.java:54) 
    at client.AlternateGUI.main(AlternateGUI.java:24) 

Oto kod:

package client; 

import java.awt.Component;* 

public class AlternateGUI { 
    private JList people; 
    private DefaultListModel dlm; 
    private JLabel l1, l2, l3; 
    private JFrame alternateGUIFrame; 
    private final static ImageIcon unavailableIcon = new ImageIcon("offline.png"); 

    public static void main(String[] args) 
    { 
     AlternateGUI ls = new AlternateGUI(); 
     ls.drawGui(); 
    } 

    public AlternateGUI(){ 
     dlm = new DefaultListModel(); 
     people = new JList(dlm); 

     alternateGUIFrame = new JFrame(); 

     JScrollPane peopleScroller = new JScrollPane(people, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); 
     people.setCellRenderer(new CellRenderer()); 

     GroupLayout alternateGUILayout = new GroupLayout(alternateGUIFrame); 
     alternateGUIFrame.setLayout(alternateGUILayout); 

     alternateGUILayout.setAutoCreateGaps(true); 
     alternateGUILayout.setAutoCreateContainerGaps(true); 
     alternateGUILayout.setHorizontalGroup(alternateGUILayout.createSequentialGroup() 
       .addComponent(peopleScroller)); 
     alternateGUILayout.setVerticalGroup(alternateGUILayout.createSequentialGroup() 
       .addComponent(peopleScroller)); 
     } 

    public void drawGui() { 
     l1 = new JLabel("Hi", unavailableIcon , JLabel.LEFT); 
     l2 = new JLabel("Hello", unavailableIcon , JLabel.LEFT); 
     l3 = new JLabel("Bye", unavailableIcon , JLabel.LEFT); 
     dlm.addElement(l1); 
     dlm.addElement(l2); 
     dlm.addElement(l3); 

     alternateGUIFrame.pack(); 
     alternateGUIFrame.setVisible(true); 
    } 

    class CellRenderer implements ListCellRenderer 
    { 
     public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) 
     { 
      Component com = (Component)value; 
      return com; 
     } 
    } 
} 

Odpowiedz

22

Twoim problemem jest to, że jesteś nieświadomie dodając układ zarówno JFrame i jej ContentPane. Rozwiązaniem jest, aby upewnić się dodać go do jedynego ContentPane JFrame za:

GroupLayout alternateGUILayout = new GroupLayout(alternateGUIFrame.getContentPane()); 
    alternateGUIFrame.getContentPane().setLayout(alternateGUILayout); 

To pierwsza linia powyżej, że liczy się najbardziej.

Inną opcją jest praca z JPanels, a następnie dodawanie JPanels do contentPlay JFrame w domyślnej pozycji BorderLayout.CENTER.

+1

Dzięki! Zazwyczaj mam JPanele i dodam je do ramki, ale dziś postanowiłem dodać wszystko bezpośrednio do ramki. Pójdę sprawdzić to i zobaczę, czy to działa! --edit-- Udało się! :) – Nonconformist

+0

@ Coolguy123: Nie ma za co. –

+0

Splendid. Dzięki za udostępnienie człowieka! – Lawrence

Powiązane problemy