[英]Java JFrame/Swing alignment
我是新手,目前正在学习JFrame,但我的ComboBox,复选框和按钮的对齐方式遇到问题。 侦听器尚未连接起来,这只是测试是否正确对齐。 我的问题是为什么对齐功能似乎不起作用? 我希望组合框位于顶部,中间是复选框,底部是按钮。
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.event.ItemListener;
import java.awt.event.ItemEvent;
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.JCheckBox;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.SwingConstants;
public class CheckBoxFrame extends JFrame
{
private final JComboBox<String> colorComboBox;
private final JCheckBox backgroundColorCheckBox;
private final JCheckBox foregroundColorCheckBox;
private final JButton okButton;
private final JButton cancelButton;
private static final String[] color =
{"Red", "Blue", "Green", "Purple"};
public CheckBoxFrame()
{
super("ColorSelect");
setLayout(new FlowLayout());
colorComboBox = new JComboBox<String>(color);
colorComboBox.setAlignmentX(SwingConstants.TOP);
add(colorComboBox);
backgroundColorCheckBox = new JCheckBox("Background");
foregroundColorCheckBox = new JCheckBox("Foreground");
foregroundColorCheckBox.setVerticalAlignment(SwingConstants.CENTER);
backgroundColorCheckBox.setVerticalAlignment(SwingConstants.CENTER);
add(backgroundColorCheckBox); // add bold checkbox to JFrame
add(foregroundColorCheckBox); // add italic checkbox to JFrame
okButton = new JButton("Ok");
cancelButton = new JButton("Cancel");
okButton.setVerticalAlignment(SwingConstants.BOTTOM);
cancelButton.setVerticalAlignment(SwingConstants.BOTTOM);
add(okButton);
add(cancelButton);
// register listeners for JCheckBoxes
CheckBoxHandler handler = new CheckBoxHandler();
backgroundColorCheckBox.addItemListener(handler);
foregroundColorCheckBox.addItemListener(handler);
}
private class CheckBoxHandler implements ItemListener
{
// respond to checkbox events
@Override
public void itemStateChanged(ItemEvent event)
{
}
}
} // end class CheckBoxFrame
从JavaDocs获得setVerticalAlignment
设置图标和文本的垂直对齐方式。
这将更改在组件上下文内布置icon
和text
属性的方式。
setVerticalAlignment
不会影响组件在容器中的布局方式。
要更改组件在容器中的布局方式,您将需要更改布局管理器,请参阅课程:在容器中布局组件
根据您的要求,有多种方法可以实现它。
您可以使用GridLayout
,将单个行的所有组件包装在自己的JPanel
并将此面板添加到主容器中。
您还可以使用GridBagLayout
,它虽然更复杂,但也更灵活
请参阅Java Swing布局管理器上的官方文档: https : //docs.oracle.com/javase/tutorial/uiswing/layout/visual.html 。
FlowLayout
是较为基本的布局管理器之一,因此建议您查看GridBagLayout
。
尝试这个:
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.event.ItemListener;
import java.awt.event.ItemEvent;
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.JCheckBox;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.SwingConstants;
public class CheckBoxFrame extends JFrame
{
private final JComboBox<String> colorComboBox;
private final JCheckBox backgroundColorCheckBox;
private final JCheckBox foregroundColorCheckBox;
private final JButton okButton;
private final JButton cancelButton;
private static final String[] color = {"Red", "Blue", "Green", "Purple"};
public CheckBoxFrame()
{
super("ColorSelect");
setLayout(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();
colorComboBox = new JComboBox<String>(color);
c.fill = GridBagConstraints.HORIZONTAL;
c.gridx = 0;
c.gridy = 0;
c.gridwidth = 2;
add(colorComboBox, c);
backgroundColorCheckBox = new JCheckBox("Background");
c.fill = GridBagConstraints.HORIZONTAL;
c.gridx = 0;
c.gridy = 1;
c.gridwidth = 1;
add(backgroundColorCheckBox, c); // add bold checkbox to JFrame
foregroundColorCheckBox = new JCheckBox("Foreground");
c.fill = GridBagConstraints.HORIZONTAL;
c.gridx = 1;
c.gridy = 1;
c.gridwidth = 1;
add(foregroundColorCheckBox, c); // add italic checkbox to JFrame
okButton = new JButton("Ok");
c.fill = GridBagConstraints.HORIZONTAL;
c.gridx = 0;
c.gridy = 2;
c.gridwidth = 1;
add(okButton, c);
cancelButton = new JButton("Cancel");
c.fill = GridBagConstraints.HORIZONTAL;
c.gridx = 1;
c.gridy = 2;
c.gridwidth = 1;
add(cancelButton, c);
// register listeners for JCheckBoxes
CheckBoxHandler handler = new CheckBoxHandler();
backgroundColorCheckBox.addItemListener(handler);
foregroundColorCheckBox.addItemListener(handler);
}
private class CheckBoxHandler implements ItemListener
{
// respond to checkbox events
@Override
public void itemStateChanged(ItemEvent event)
{
}
}
} // end class CheckBoxFrame
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.