【问题标题】:Getting InvalidStateException when using JComboBox in GroupLayout在 GroupLayout 中使用 JComboBox 时出现 InvalidStateException
【发布时间】:2021-04-20 15:44:31
【问题描述】:

我是第一次尝试GroupLayout。当我刚刚将组件添加到包含 JPanel 的组件时,并非所有组件都显示了,但 JComboBox 是确实显示的组件之一。实例化组件后,我使用了GroupLayout API 的addComponent 方法,但是当我运行程序时,我在JComboBox 上得到了一个InvalidStateException

这里是代码

public class PersonalInfo extends JPanel {

    private JLabel jLabel1;
    private JTextField firstName;
    private JTextField lastName;
    private JLabel jLabel2;
    private JTextField address1;
    private JTextField address2;
    private JCheckBox toggleAddress3;
    private JTextField address3;
    private JTextField city;
    private JTextField state;
    private JTextField postalCode;
    private JLabel jLabel3;
    private JComboBox<String> gender;
    private JLabel jLabel4;
//    private Date dateOfBirth;

    /**
     * Creates new form PersonalInfo
     */
    public PersonalInfo() {
        initComponents();
        setPreferredSize(new Dimension(400, 800));
        validate();
    }

    private void initComponents() {
        GroupLayout groupLayout = new GroupLayout(this);
        setLayout(groupLayout);
        groupLayout.setAutoCreateGaps(true);
        groupLayout.setAutoCreateContainerGaps(true);

        jLabel1 = new JLabel("Name");
        jLabel1.setHorizontalAlignment(SwingConstants.RIGHT);

        firstName = new JTextField(50);
        firstName.setToolTipText("First Name");

        lastName = new JTextField(50);
        lastName.setToolTipText("Last Name");

        jLabel2 = new JLabel("Address");
        jLabel2.setHorizontalAlignment(SwingConstants.RIGHT);

        address1 = new JTextField(50);
        address1.setToolTipText("Address 1");

        address2 = new JTextField(50);
        address2.setToolTipText("Address 2");
        add(address2);

        toggleAddress3 = new javax.swing.JCheckBox();
        toggleAddress3.setText("Show third address");
        toggleAddress3.addMouseListener(new MouseListener() {
            @Override
            public void mouseClicked(MouseEvent e) {
                setToggle();
            }

            @Override
            public void mousePressed(MouseEvent e) {
            }

            @Override
            public void mouseReleased(MouseEvent e) {
            }

            @Override
            public void mouseEntered(MouseEvent e) {
            }

            @Override
            public void mouseExited(MouseEvent e) {
            }
        });

        address3 = new JTextField(50);
        address3.setToolTipText("Address 3");
        address3.setVisible(false);

        city = new JTextField(50);
        city.setToolTipText("City");

        state = new JTextField(10);
        state.setToolTipText("State");

        postalCode = new JTextField(25);
        postalCode.setToolTipText("Postal Code");

        jLabel3 = new JLabel("Gender");
        jLabel3.setHorizontalAlignment(SwingConstants.RIGHT);
        add(jLabel3);

        String[] items = {"", "Male", "Female"};
        gender = new JComboBox<String>(items);
        gender.setToolTipText("Gender");

        jLabel4 = new JLabel("Date of Birth");
        jLabel4.setHorizontalAlignment(SwingConstants.RIGHT);

        groupLayout.setHorizontalGroup(groupLayout.createParallelGroup()
            .addGroup(groupLayout.createParallelGroup(GroupLayout.Alignment.BASELINE)
                .addComponent(jLabel1)
                .addComponent(firstName)
                .addComponent(lastName))
            .addGroup(groupLayout.createParallelGroup(GroupLayout.Alignment.BASELINE)
                .addComponent(jLabel2)
                .addComponent(address1))
            .addGroup(groupLayout.createParallelGroup(GroupLayout.Alignment.BASELINE)
                .addComponent(toggleAddress3)
                .addComponent(address2))
            .addComponent(address3)
            .addGroup(groupLayout.createParallelGroup(GroupLayout.Alignment.BASELINE)
                .addComponent(city)
                .addComponent(state)
                .addComponent(postalCode))
            .addGroup(groupLayout.createParallelGroup(GroupLayout.Alignment.BASELINE)
                .addComponent(jLabel3)
                .addComponent(gender))
            .addComponent(jLabel4)
        );
        groupLayout.setVerticalGroup(groupLayout.createParallelGroup()
            .addGroup(groupLayout.createParallelGroup(GroupLayout.Alignment.TRAILING))
            .addComponent(jLabel1)
            .addComponent(jLabel2)
            .addComponent(jLabel3)
            .addComponent(jLabel4));
    }

    private void setToggle() {
        if (toggleAddress3.isSelected()) {
            address3.setVisible(false);
        } else {
            address3.setVisible(true);
        }
        repaint();
    }

}

非常感谢任何帮助。

挠头,

汤姆·马加罗

【问题讨论】:

    标签: java swing jcombobox grouplayout


    【解决方案1】:

    请参阅How to Use GroupLayout

    每个组件都需要在布局中定义两次。如果您忘记执行此操作,GroupLayout 将生成异常。

    您没有将所有组件都添加到水平组和垂直组中,因此您得到了例外。

    实际上,这是我建议实际使用 IDE 的 GUI 构建器的一次,因为 GroupLayout 是专门为 GUI 构建器创建的。使用构建器创建 GUI 后,查看它生成的 [java] 代码,以尝试了解 GroupLayout 的工作原理。

    我试图猜测您希望PersonalInfo 面板的外观并使用 Eclipse WindowBuilder 创建了一个。对于它的价值,这里是生成的代码。

    请注意,我为出生日期字段添加了JSpinner

    import javax.swing.JPanel;
    import javax.swing.GroupLayout;
    import javax.swing.GroupLayout.Alignment;
    import javax.swing.JLabel;
    import javax.swing.JTextField;
    import javax.swing.LayoutStyle.ComponentPlacement;
    import javax.swing.JCheckBox;
    import javax.swing.JComboBox;
    import javax.swing.JFrame;
    import javax.swing.DefaultComboBoxModel;
    import javax.swing.JSpinner;
    import javax.swing.SpinnerDateModel;
    import java.util.Date;
    import java.awt.BorderLayout;
    import java.awt.EventQueue;
    import java.util.Calendar;
    
    public class WndwBldr extends JPanel {
        private JLabel nameLabel;
        private JTextField firstNameTextField;
        private JTextField lastNameTextField;
        private JLabel addressLabel;
        private JTextField address1TextField;
        private JTextField address2TextField;
        private JCheckBox toggleAddress3;
        private JTextField address3TextField;
        private JTextField cityTextField;
        private JTextField stateTextField;
        private JTextField postalCodeTextField;
        private JLabel genderLabel;
        private JComboBox<String> genderComboBox;
        private JLabel dateOfBirthLabel;
        private JSpinner dateOfBirthSpinner;
    
        /**
         * Create the panel.
         */
        public WndwBldr() {
            GroupLayout groupLayout = new GroupLayout(this);
            groupLayout.setHorizontalGroup(
                groupLayout.createParallelGroup(Alignment.LEADING)
                    .addGroup(groupLayout.createSequentialGroup()
                        .addContainerGap()
                        .addGroup(groupLayout.createParallelGroup(Alignment.LEADING)
                            .addComponent(getNameLabel())
                            .addComponent(getAddressLabel())
                            .addComponent(getGenderLabel()))
                        .addPreferredGap(ComponentPlacement.RELATED)
                        .addGroup(groupLayout.createParallelGroup(Alignment.LEADING)
                            .addComponent(getFirstNameTextField(), GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
                            .addComponent(getAddress1TextField(), GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
                            .addComponent(getCityTextField(), GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
                            .addComponent(getGenderComboBox(), GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE))
                        .addPreferredGap(ComponentPlacement.UNRELATED)
                        .addGroup(groupLayout.createParallelGroup(Alignment.LEADING)
                            .addComponent(getLastNameTextField(), GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
                            .addGroup(groupLayout.createSequentialGroup()
                                .addComponent(getStateTextField(), GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
                                .addPreferredGap(ComponentPlacement.RELATED)
                                .addComponent(getPostalCodeTextField(), GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE))
                            .addGroup(groupLayout.createSequentialGroup()
                                .addComponent(getAddress2TextField(), GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
                                .addPreferredGap(ComponentPlacement.RELATED)
                                .addComponent(getToggleAddress3())
                                .addPreferredGap(ComponentPlacement.RELATED)
                                .addComponent(getAddress3TextField(), GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE))
                            .addGroup(groupLayout.createSequentialGroup()
                                .addComponent(getDateOfBirthLabel())
                                .addPreferredGap(ComponentPlacement.UNRELATED)
                                .addComponent(getDateOfBirthSpinner(), GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)))
                        .addContainerGap(103, Short.MAX_VALUE))
            );
            groupLayout.setVerticalGroup(
                groupLayout.createParallelGroup(Alignment.LEADING)
                    .addGroup(groupLayout.createSequentialGroup()
                        .addGroup(groupLayout.createParallelGroup(Alignment.LEADING)
                            .addGroup(groupLayout.createSequentialGroup()
                                .addContainerGap()
                                .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE)
                                    .addComponent(getNameLabel())
                                    .addComponent(getLastNameTextField(), GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
                                    .addComponent(getFirstNameTextField(), GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE))
                                .addPreferredGap(ComponentPlacement.RELATED)
                                .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE)
                                    .addComponent(getAddressLabel())
                                    .addComponent(getAddress1TextField(), GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
                                    .addComponent(getAddress2TextField(), GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
                                    .addComponent(getToggleAddress3())))
                            .addGroup(groupLayout.createSequentialGroup()
                                .addGap(38)
                                .addComponent(getAddress3TextField(), GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)))
                        .addPreferredGap(ComponentPlacement.RELATED)
                        .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE)
                            .addComponent(getCityTextField(), GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
                            .addComponent(getStateTextField(), GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
                            .addComponent(getPostalCodeTextField(), GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE))
                        .addPreferredGap(ComponentPlacement.RELATED)
                        .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE)
                            .addComponent(getGenderLabel())
                            .addComponent(getGenderComboBox(), GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
                            .addComponent(getDateOfBirthLabel())
                            .addComponent(getDateOfBirthSpinner(), GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE))
                        .addContainerGap(190, Short.MAX_VALUE))
            );
            setLayout(groupLayout);
    
        }
        private JLabel getNameLabel() {
            if (nameLabel == null) {
                nameLabel = new JLabel("Name");
            }
            return nameLabel;
        }
        private JTextField getFirstNameTextField() {
            if (firstNameTextField == null) {
                firstNameTextField = new JTextField();
                firstNameTextField.setColumns(10);
            }
            return firstNameTextField;
        }
        private JTextField getLastNameTextField() {
            if (lastNameTextField == null) {
                lastNameTextField = new JTextField();
                lastNameTextField.setColumns(10);
            }
            return lastNameTextField;
        }
        private JLabel getAddressLabel() {
            if (addressLabel == null) {
                addressLabel = new JLabel("Address");
            }
            return addressLabel;
        }
        private JTextField getAddress1TextField() {
            if (address1TextField == null) {
                address1TextField = new JTextField();
                address1TextField.setColumns(10);
            }
            return address1TextField;
        }
        private JTextField getAddress2TextField() {
            if (address2TextField == null) {
                address2TextField = new JTextField();
                address2TextField.setColumns(10);
            }
            return address2TextField;
        }
        private JCheckBox getToggleAddress3() {
            if (toggleAddress3 == null) {
                toggleAddress3 = new JCheckBox("");
            }
            return toggleAddress3;
        }
        private JTextField getAddress3TextField() {
            if (address3TextField == null) {
                address3TextField = new JTextField();
                address3TextField.setColumns(10);
            }
            return address3TextField;
        }
        private JTextField getCityTextField() {
            if (cityTextField == null) {
                cityTextField = new JTextField();
                cityTextField.setColumns(10);
            }
            return cityTextField;
        }
        private JTextField getStateTextField() {
            if (stateTextField == null) {
                stateTextField = new JTextField();
                stateTextField.setColumns(10);
            }
            return stateTextField;
        }
        private JTextField getPostalCodeTextField() {
            if (postalCodeTextField == null) {
                postalCodeTextField = new JTextField();
                postalCodeTextField.setColumns(10);
            }
            return postalCodeTextField;
        }
        private JLabel getGenderLabel() {
            if (genderLabel == null) {
                genderLabel = new JLabel("Gender");
            }
            return genderLabel;
        }
        private JComboBox<String> getGenderComboBox() {
            if (genderComboBox == null) {
                genderComboBox = new JComboBox<>();
                genderComboBox.setModel(new DefaultComboBoxModel<String>(new String[] {"", "male", "female"}));
            }
            return genderComboBox;
        }
        private JLabel getDateOfBirthLabel() {
            if (dateOfBirthLabel == null) {
                dateOfBirthLabel = new JLabel("Date of Birth");
            }
            return dateOfBirthLabel;
        }
        private JSpinner getDateOfBirthSpinner() {
            if (dateOfBirthSpinner == null) {
                dateOfBirthSpinner = new JSpinner();
                dateOfBirthSpinner.setModel(new SpinnerDateModel(new Date(-7200000L), new Date(-2208996000000L), new Date(1610661600000L), Calendar.DAY_OF_YEAR));
            }
            return dateOfBirthSpinner;
        }
        public static void main(String[] args) {
            EventQueue.invokeLater(() -> {
                JFrame frame = new JFrame();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new WndwBldr(), BorderLayout.CENTER);
                frame.pack();
                frame.setLocationByPlatform(true);
                frame.setVisible(true);
            });
        }
    }
    

    这是一个屏幕截图。

    【讨论】:

    • 谢谢阿布拉。我会试试的
    【解决方案2】:

    将组件添加到垂直轴有效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多