问题描述
我是第一次尝试 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();
}
}
非常感谢您对此的任何帮助。
挠头,
汤姆·马加罗
解决方法
每个组件都需要在布局中定义两次。如果您忘记这样做,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);
});
}
}
这是屏幕截图。
,将组件添加到垂直轴有效。