复选框
复选框需要一个紧邻它的标签来说明其用途。在构造器中指定标签文本。
bold = new JCheckBox("Bold")
可以使用setSelected方法来选定或取消选定复选框。
bold.setSelected(true)
isSelected 方法将返回每个复选框的当前状态。如果没有选取则为false,否则为true.
当用户点击复选框时将触发一个动作事件。通常,可以为复选框设置一个动作监听器。下面的例子,两个复选框使用了同一个动作监听器。
ActionListener listener = . . .
bold.addActionListener(listener);
italic.addActionListener(listener);
actionPerformed方法查询bold和italic两个复选框的状态,并且把面板中的字体设置为常规、加粗、倾斜或者粗斜体。
package checkbox;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class CheckBox {
public static void main(String[] args){
EventQueue.invokeLater(new Runnable(){
public void run(){
JFrame frame = new CheckBoxFrame();
frame.setTitle("CheckBox");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
});
}
}
class CheckBoxFrame extends JFrame{
private static final long serialVersionUID = 1L;
private static final int DEFAULT_WIDTH = 700;
private static final int DEFAULT_HEIGHT = 500;
private JLabel label;
private JCheckBox bold;
private JCheckBox itatic;
private static final int FONTSIZE = 24;
public CheckBoxFrame(){
setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT); //设置窗口大小
//设置两个复选框的监听事件
ActionListener listener = new ActionListener(){
public void actionPerformed(ActionEvent event){
int mode = 0;
if (bold.isSelected()) mode += Font.BOLD;
if (itatic.isSelected()) mode += Font.ITALIC;
label.setFont(new Font("Serif", mode, FONTSIZE));
}
};
//创建标签画板
JPanel centerPanel = new JPanel();
label = new JLabel("Do what you want to do...");
label.setFont(new Font("Serif", Font.PLAIN, FONTSIZE));
centerPanel.add(label);
add(centerPanel, BorderLayout.CENTER);
//创建复选框画板
JPanel buttonPanel = new JPanel();
bold = new JCheckBox("Bold");
bold.addActionListener(listener);
buttonPanel.add(bold);
itatic = new JCheckBox("Itatic");
itatic.addActionListener(listener);
buttonPanel.add(itatic);
add(buttonPanel, BorderLayout.SOUTH);
}
}
JCheckBox(String label, Icon icon)
构造一个复选框,初始没有被选择JCheckBox(String label, boolean state)
用给定的标签和初始化状态构造一个复选框boolean isSelected()
void setSecected(boolean state)
获取或设置复选框的选择状态
单选按钮
在Swing中,实现单选按钮组非常简单。为单选按钮组构造一个ButtonGroup的对象。然后,再将 JRadioButton 类型的对象添加到按钮中。按钮组负责在新按钮被按下时,取消前一个被按下的按钮的选择状态。
ButtonGroup group = new ButtonGroup();
JRadioButton smallButton = new JRadioButton("Small", false);
group.add(smallButton);
构造器的第二个参数为true表明这个按钮初始状态是被选择,其他按钮构造器的这个参数为false。注意,按钮组仅仅控制按钮的行为,如果想把这些按钮组织在一起布局,需要把他们添加到容器中,如JPanel。
单选按钮的事件通知机制和其他的按钮一样。不同的是,每个单选按钮都对应一个不同监听器对象。每个监听器对象都做不同的事件。
package radioButton;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class RadioButton extends JFrame{
private static final long serialVersionUID = 1L;
public static void main(String[] args){
RadioButton radioButton = new RadioButton();
radioButton.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
radioButton.setVisible(true);
}
private JPanel buttonPanel;
private ButtonGroup group;
private JLabel label;
private static final int DEFAULT_SIZE = 36;
private static final int DEFAULT_WIDTH = 700;
private static final int DEFAULT_HEIGHT = 500;
public RadioButton(){
setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
label = new JLabel("Today is a sad day...");
label.setFont(new Font("Serif", Font.PLAIN, DEFAULT_SIZE));
add(label, BorderLayout.CENTER); //将标签添加到框架的中间
buttonPanel = new JPanel();
group = new ButtonGroup();
addRadioButton("Small", 8);
addRadioButton("Medium", 12);
addRadioButton("Large", 18);
addRadioButton("Extra large", 36);
add(buttonPanel, BorderLayout.SOUTH);
}
/**
* @param name ——要添加按钮的名称
* @param size ——这个按钮要设置的字体大小
*/
public void addRadioButton(String name, final int size){
boolean selected = size == DEFAULT_SIZE;
JRadioButton button = new JRadioButton(name, selected);
group.add(button);
buttonPanel.add(button);
ActionListener listener = new ActionListener(){
public void actionPerformed(ActionEvent event){
label.setFont(new Font("Serif", Font.PLAIN, size));
}
};
button.addActionListener(listener);
}
}
JRadioButton(String label, Icon icon)
构造一个单选按钮,初始没有被选择JRadioButton(String label, boolean state)
用给定的标签和初始状态构造一个单选按钮void add(AbstractButton b)
将按钮添加到组中ButtonModel getSelection()
返回被选择的按钮的按钮模型String getActionCommand()
返回按钮模型的动作命令void setActionCommand(String s)
设置按钮及其模型的动作命令
边框
用来指出哪些按钮属于同一组。
- 调用 BorderFactory 的静态方法创建边框。有几种风格:凹斜面、凸斜面、蚀刻、直线、蒙版。
- 如果愿意,可以给边框加标题,具体的实现方法是将边框传递给:BorderFactory.createTitledBorder
- 如果确实想把一切凸显出来,可以调用下面的方法将几种边框组合起来使用:BorderFactory.createCompoundBorder
- 调用JComponent类中的setBorder方法将结果边框添加到组件中。
下面代码说明了如何把一个带有标题的蚀刻边框添加到一个面板上
Border etched = BorderFactory.createEtchedBorder();
Border titled = BorderFactory.createTitledBorder(etched, "A Title");
panel.setBorder(titled)
package border;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;
public class BorderFrame extends JFrame{
private static final long serialVersionUID = 1L;
public static void main(String[] args){
BorderFrame borderFrame = new BorderFrame();
borderFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
borderFrame.setVisible(true);
}
private JPanel demoPanel;
private JPanel buttonPanel;
private ButtonGroup group;
private static final int DEFAULT_WIDTH = 700;
private static final int DEFAULT_HEIGHT = 500;
public BorderFrame(){
setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
demoPanel = new JPanel();
buttonPanel = new JPanel();
group = new ButtonGroup();
addRadioButton("Lowered bevel", BorderFactory.createLoweredBevelBorder());
addRadioButton("Raised bevel", BorderFactory.createRaisedBevelBorder());
addRadioButton("Etched", BorderFactory.createEtchedBorder());
addRadioButton("Line", BorderFactory.createLineBorder(Color.BLUE));
addRadioButton("Matte", BorderFactory.createMatteBorder(10, 10, 10, 10, Color.BLUE));
addRadioButton("Empty", BorderFactory.createEmptyBorder());
Border etched = BorderFactory.createEtchedBorder();
Border titled = BorderFactory.createTitledBorder(etched, "Border types");
buttonPanel.setBorder(titled);
setLayout(new GridLayout(2, 1));
add(buttonPanel);
add(demoPanel);
}
public void addRadioButton(String buttonName, final Border b){
JRadioButton button = new JRadioButton(buttonName);
button.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent event){
demoPanel.setBorder(b);
}
});
group.add(button);
buttonPanel.add(button);
}
}
static Border CreateLineBorder(Color color, int thicksness)
创建一个简单的直线边框static MatteBorder createMatteBorder(int top, int left, int bottom, int right, Icon titleIcon)
创建一个用 color 颜色或一个重复图标填充的粗的边框。static Border createEmptyBorder(int top, int left, int bottom, int right)
创建一个空白边框static Border createEtchedBorder(int type, Color highlight, Color shadow)
创建一个具有3D效果的直线边框
hightlight, shadow : 用于3D效果的颜色
type: EtchedBorder.RAISED 和 EtchedBorder.LOWERED之一static Border createRaisedBevelBorder()
创建一个具有凹面或凸面效果的边框
type : BevelBorder.LOWERED 和 BevelBorder.RAISED之一
highlight, shadow : 用于3D效果的颜色static TitledBorder createTitledBorder(Border border, String title, int justification, int position, Font font, Color color)
创建一个具有给定特性的带标题的边框
title :标题字符串
border :用标题装饰的边框
justification : TitledBorder 常量LEFT, CENTER, RIGHT, LEADING, trAILING,或DEFAULT_JUSTIFICATION之一。
position: TitledBorder 常量ABOVE_TOP,TOP,BELOW_TOP,ABOVE_BOTTOM,BOTTOM,BELOW_BOTTOM 或 DEFAULT_POSITION之一。
font :标题的字体
color :标题的颜色static CompoundBorder createCompoundBorder(Border outsideBorder, Border insideBorder)
将两个边框组合成一个新的边框SoftBevelBorder(int type, Color hightlight, Color shadow)
创建一个带有柔和边角的斜面边框
type :BevelBorder.LOWERED 和 BevelBorder.RAISED 之一
hight, shadow :用于3D效果的颜色public LineBorder(Color color, int thickness, boolean roundedCorners)
用指定的颜色和粗细创建一个直线边框。如果roundedCorners为true,则边框具有圆角。void setBorder(Border border)
设置这个组件的边框
组合框
当多个选择时没使用单选按钮会占用较大的空间,这时可以使用组合框。当用户点击这个组件时,选择列表会下拉出来,并且下拉的列表还可以设置成被编辑(调用setEditable方法),编辑只会影响当前项,不会改变列表的内容。
-
可以调用addItem方法增加选项。这个方法将字符串添加到列表的尾部。
JComboBox< String > faceCombo = new JComboBox<>();
faceCombo.addItem("Serif");
faceCombo.addItem("SanSerif");
-
利用insertItemAt方法在列表的任何位置插入一个新选项。可以增加任何类型的选项,组合框可以调用每个选项的 toString 方法显示内容。
faceCombo.insertItemAt("Monospaced", 0)
-
可以使用 removeItem 或者 removeItemAt方法,使用哪个方法取决于参数提供的是选项内容还是位置
faceCombo.removeItem("Monospaced");
faceCombo.removeItemAt(0);
-
调用 removeAllItems 方法将立即移除所有的选项。
package comboBox;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class ComboBoxFrame extends JFrame{
private static final long serialVersionUID = 1L;
public static void main(String[] args){
ComboBoxFrame comboBox = new ComboBoxFrame();
comboBox.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
comboBox.setVisible(true);
}
private JComboBox<String> faceCombo;
private JLabel label;
private static final int DEFAULT_SIZE = 24;
private static final int DEFAULT_WIDTH = 700;
private static final int DEFAULT_HEIGHT = 500;
public ComboBoxFrame(){
setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
label = new JLabel("Today is a rain day..");
label.setFont(new Font("Serif", Font.PLAIN, DEFAULT_SIZE)); //设置标签字体
add(label, BorderLayout.CENTER); //将标签添加到框架的中间
faceCombo = new JComboBox<>();
faceCombo.addItem("Serif");
faceCombo.addItem("SansSerif");
faceCombo.addItem("Monospaced");
faceCombo.addItem("Dialog");
faceCombo.addItem("DialogInput");
faceCombo.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent event){
label.setFont(new Font(faceCombo.getItemAt(faceCombo.getSelectedIndex()),
Font.PLAIN, DEFAULT_SIZE));
}
});
JPanel comboPanel = new JPanel(); //为复选框添加画板
comboPanel.add(faceCombo);
add(comboPanel, BorderLayout.SOUTH);
}
}
void setEditable(boolean b)
获取或设置组合框的可编辑特性void addItem(Object item)
把一个选项添加到选项列表中void insertItemAt(Object item, int index)
将一个选项添加到选项列表的指定位置void removeItem(Object item)
从选项列表中删除一个选项void removeAllItems()
从选项列表中删除所有选项void removeItemAt(int index)
删除指定位置的选项Object getSelectedItem()
返回当前选择的选项
滑动条
组合框可以让用户从一组离散值中进行选择,滑动条允许进行连续值的选择。
通常,用下面的方式构造滑动条:
JSlider slider = new JSlider(min, max, initialValue);
如果省略最小值、最大值和初始值,其默认值分别为0, 100,50.
按照下面的方式构造垂直滑动条:
JSlider slider = new JSlider(SwingConstants.VERTICAL, min, max, initialValue);
当用户的滑动条滑动时,滑动条对应的值也在变化,ChangeEvent 就会发送给所有变化的监听器。为了得到这些改变的通知,需要调用 addChangeListener 方法并且安装一个实现了ChangeListener接口的对象。这个接口只有y一个方法 StateChanged。在这个方法中可以获得滑动条的当前值。
public void stateChanged(ChangeEvent event){
JSlider slider = (JSlider) event.getSource();
int value = slider.getValue();
...
}
为滑动条显示标尺:
slider.setMajorTickSpacing(20); // 每20个单位的位置显示一个大标尺标记
slider.setMinorTickSpacing(5); // 每5个单位的位置显示一个小标尺标记
将他们显示出来:
slider.setPaintTicks(true);
强制滑动条对其标尺:
slider.setSnapToTicks(true);
为大标尺添加标尺标记标签:
slider.setPaintLabels(true);
将标尺标签设置为A,B,C,D,E,F:
Hashtable<Integr, Component> labelTabel = new Hashtable<Integr, Component>();
labelTable.put(0, new JLabel("A"));
labelTable.put(20, new JLabel("B"));
...
labelTable.put(100, new JLabel("F"));
slider.setLabelTable(labelTable);
样例程序
package slider;
import java.awt.*;
import javax.swing.event.*;
import javax.swing.*;
import java.util.*;
public class SliderFrame extends JFrame{
private static final long serialVersionUID = 1L;
public static void main(String[] args){
SliderFrame sliderFrame = new SliderFrame();
sliderFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
sliderFrame.setVisible(true);
}
private JPanel sliderPanel;
private JTextField textField;
private ChangeListener listener;
private static final int DEFAULT_WIDTH = 700;
private static final int DEFAULT_HEIGHT = 500;
public SliderFrame() {
setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
sliderPanel = new JPanel();
sliderPanel.setLayout(new GridBagLayout());
listener = new ChangeListener(){
public void stateChanged(ChangeEvent event) {
JSlider source = (JSlider) event.getSource();
textField.setText("" + source.getValue());
}
};
JSlider slider = new JSlider();
addSlider(slider, "Plain");
slider = new JSlider();
slider.setPaintTicks(true);
slider.setMajorTickSpacing(20);
slider.setMinorTickSpacing(5);
addSlider(slider, "Ticks");
slider = new JSlider();
slider.setPaintTicks(true);
slider.setSnapToTicks(true);
slider.setMajorTickSpacing(20);
slider.setMinorTickSpacing(5);
addSlider(slider, "Snap to ticks");
slider = new JSlider();
slider.setPaintTicks(true);
slider.setPaintTrack(false);
slider.setMajorTickSpacing(20);
slider.setMinorTickSpacing(5);
addSlider(slider, "No track");
slider = new JSlider();
slider.setPaintTicks(true);
slider.setInverted(true);
slider.setMajorTickSpacing(20);
slider.setMinorTickSpacing(5);
addSlider(slider, "Inverted");
slider = new JSlider();
slider.setPaintTicks(true);
slider.setPaintLabels(true);
slider.setMajorTickSpacing(20);
slider.setMinorTickSpacing(5);
addSlider(slider, "Labels");
slider = new JSlider();
slider.setPaintTicks(true);
slider.setPaintLabels(true);
slider.setMajorTickSpacing(20);
slider.setMinorTickSpacing(5);
Dictionary<Integer, Component> labelTable = new Hashtable<>();
labelTable.put(0, new JLabel("A"));
labelTable.put(20, new JLabel("B"));
labelTable.put(40, new JLabel("C"));
labelTable.put(60, new JLabel("D"));
labelTable.put(80, new JLabel("E"));
labelTable.put(100, new JLabel("F"));
slider.setLabelTable(labelTable);
addSlider(slider, "Custom labels");
slider = new JSlider();
slider.setPaintTicks(true);
slider.setPaintLabels(true);
slider.setSnapToTicks(true);
slider.setMajorTickSpacing(20);
slider.setMinorTickSpacing(20);
labelTable = new Hashtable<Integer, Component>();
labelTable.put(0, new JLabel(new ImageIcon("nine.gif")));
labelTable.put(20, new JLabel(new ImageIcon("ten.gif")));
labelTable.put(40, new JLabel(new ImageIcon("jack.gif")));
labelTable.put(60, new JLabel(new ImageIcon("queen.gif")));
labelTable.put(80, new JLabel(new ImageIcon("king.gif")));
labelTable.put(100, new JLabel(new ImageIcon("ace.gif")));
slider.setLabelTable(labelTable);
addSlider(slider, "Icon labels");
textField = new JTextField();
add(sliderPanel, BorderLayout.CENTER);
add(textField, BorderLayout.SOUTH);
}
public void addSlider(JSlider s, String description){
s.addChangeListener(listener);
JPanel panel = new JPanel();
panel.add(s);
panel.add(new JLabel(description));
panel.setAlignmentX(Component.LEFT_ALIGNMENT);
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridy = sliderPanel.getComponentCount();
gbc.anchor = GridBagConstraints.WEST;
sliderPanel.add(panel, gbc);
}
}
JSlider(int direction, int min, int max, int initialValue)
用给定的方向、最大值、最小值和初始化值构造一个水平滑动条
direction :SwingConstants.HORIZONTAL 或 SwingConstants.VERTICAL 之一。默认为水平
min, max :滑动条的最小值、最大值。默认为0到99
initialValue :滑动条的初始化值。默认值是50void setPaintTicks(boolean b)
如果 b 为true,显示为标尺void setMinorTickSpacing(int units)
用给定的滑动条单位的倍数设置大标尺和小标尺void setPaintLabels(boolean b)
如果 b 是true,显示标尺标签void setLabelTable(Dictionary table)
设置用于作为标尺标签的组件。表中的每一个键/值对都采用 new Integer(value) / component的格式。void setSnapToTicks(boolean b)
如果 b 是 true,每一次调整后滑块都要对齐到最接近的标尺处void setPaintTrack(boolean b)
如果 b 是 true,显示滑动条滑动的轨迹