微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 GroupLayout 中使用 JComboBox 时获取 InvalidStateException

如何解决在 GroupLayout 中使用 JComboBox 时获取 InvalidStateException

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

这是代码

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

}

非常感谢您对此的任何帮助。

挠头,

汤姆·马加罗

解决方法

参考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)
                        .addComponent(getCityTextField(),GroupLayout.PREFERRED_SIZE)
                        .addComponent(getGenderComboBox(),GroupLayout.PREFERRED_SIZE))
                    .addPreferredGap(ComponentPlacement.UNRELATED)
                    .addGroup(groupLayout.createParallelGroup(Alignment.LEADING)
                        .addComponent(getLastNameTextField(),GroupLayout.PREFERRED_SIZE)
                        .addGroup(groupLayout.createSequentialGroup()
                            .addComponent(getStateTextField(),GroupLayout.PREFERRED_SIZE)
                            .addPreferredGap(ComponentPlacement.RELATED)
                            .addComponent(getPostalCodeTextField(),GroupLayout.PREFERRED_SIZE))
                        .addGroup(groupLayout.createSequentialGroup()
                            .addComponent(getAddress2TextField(),GroupLayout.PREFERRED_SIZE)
                            .addPreferredGap(ComponentPlacement.RELATED)
                            .addComponent(getToggleAddress3())
                            .addPreferredGap(ComponentPlacement.RELATED)
                            .addComponent(getAddress3TextField(),GroupLayout.PREFERRED_SIZE))
                        .addGroup(groupLayout.createSequentialGroup()
                            .addComponent(getDateOfBirthLabel())
                            .addPreferredGap(ComponentPlacement.UNRELATED)
                            .addComponent(getDateOfBirthSpinner(),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)
                                .addComponent(getFirstNameTextField(),GroupLayout.PREFERRED_SIZE))
                            .addPreferredGap(ComponentPlacement.RELATED)
                            .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE)
                                .addComponent(getAddressLabel())
                                .addComponent(getAddress1TextField(),GroupLayout.PREFERRED_SIZE)
                                .addComponent(getAddress2TextField(),GroupLayout.PREFERRED_SIZE)
                                .addComponent(getToggleAddress3())))
                        .addGroup(groupLayout.createSequentialGroup()
                            .addGap(38)
                            .addComponent(getAddress3TextField(),GroupLayout.PREFERRED_SIZE)))
                    .addPreferredGap(ComponentPlacement.RELATED)
                    .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE)
                        .addComponent(getCityTextField(),GroupLayout.PREFERRED_SIZE)
                        .addComponent(getStateTextField(),GroupLayout.PREFERRED_SIZE)
                        .addComponent(getPostalCodeTextField(),GroupLayout.PREFERRED_SIZE))
                    .addPreferredGap(ComponentPlacement.RELATED)
                    .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE)
                        .addComponent(getGenderLabel())
                        .addComponent(getGenderComboBox(),GroupLayout.PREFERRED_SIZE)
                        .addComponent(getDateOfBirthLabel())
                        .addComponent(getDateOfBirthSpinner(),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);
        });
    }
}

这是屏幕截图。

screen capture of running app

,

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。