14

このエラーが発生する理由がわかりません。GroupLayout を使用しているのは、これで間隔を空ける必要があり、将来的にフレームにパネルを追加する予定だからです。以下はスタックトレースです。

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)

コードは次のとおりです。

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

1 に答える 1

24

問題は、無意識のうちに JFrame とその contentPane の両方にレイアウトを追加していることです。解決策は、JFrame の contentPane のみに追加することです。

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

最も重要なのは上記の最初の行です。

もう 1 つのオプションは、JPanels を操作してから、JPanels を JFrame の contentPane のデフォルトの BorderLayout.CENTER 位置に追加することです。

于 2012-11-23T18:17:53.827 に答える