2012-11-23 27 views
12

Không chắc chắn tại sao lỗi này lại xuất hiện. Tôi đang sử dụng GroupLayout vì tôi muốn nó làm khoảng cách cho tôi và sẽ bổ sung thêm nhiều khung cho khung trong tương lai. Dưới đây là dấu vết ngăn xếp.GroupLayout chỉ có thể được sử dụng với một vùng chứa tại một thời điểm

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) 

Đây là mã:

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

Trả lời

22

Vấn đề của bạn là bạn đang vô tình thêm cách bố trí cho cả JFrame và ContentPane của nó. Giải pháp là đảm bảo bạn thêm nó vào contentPane của JFrame chỉ:

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

Đây là dòng đầu tiên ở trên quan trọng nhất.

Tùy chọn khác là làm việc với JPanels, sau đó thêm JPanels vào contentPane của JFrame ở vị trí BorderLayout.CENTER mặc định của nó.

+1

Cảm ơn! Thông thường tôi có JPanels và thêm chúng vào khung nhưng hôm nay tôi quyết định thêm mọi thứ trực tiếp vào khung. Tôi sẽ kiểm tra điều này và xem nó có hoạt động không! --edit-- Nó đã hoạt động! :) – Nonconformist

+0

@ Coolguy123: bạn được chào đón. –

+0

Splendid. Cảm ơn bạn đã chia sẻ người đàn ông! – Lawrence