11.4选择组件
复选框,单选按钮,选项列表,以及滑块。
11.4.1 复选框
如果想要接收的输入只是是或否,就可以使用复选框组件。复选框自动带有标识标签。用户点击就一个复选框将它选中,再点击则取消选中,当复选框获得焦点时,用户也可以通过按空格键来切换选择。
在构造器中指定标签文本。
var bold=new JCheckBox("Boid");
可以使用setSelected方法来选中或取消选中复选框。
//初始化时复选框就被选中
boid.setSelected(true);
isSelected方法将获取每个复选框的当前状态。如果没有选中则为false,选中复选框为true。
当用户点击复选框时将触发一个动作事件。与以往一样,可以为复选框关联一个动作监听器。
ActionListener listener=......;
bold.addActionListener(listener);
italic.addActionListener(listener);
监听器代码示例:
AbstractAction action=new AbstractAction() {
@Override
public void actionPerformed(ActionEvent actionEvent) {
int mode=0;
if(bold.isSelected())mode+=Font.BOLD;
if(italic.isSelected())mode+=Font.ITALIC;
label.setFont(new Font(Font.SERIF,mode,32));
}
}
// 或用lamba表达式
AbstractAction action=event->
{
int mode=0;
if(bold.isSelected())mode+=Font.BOLD;
if(italic.isSelected())mode+=Font.ITALIC;
label.setFont(new Font(Font.SERIF,mode,32));
};
常用方法:
方法名 | 方法作用 |
---|---|
JCheckBox(String label) | 构造一个复选框 |
JCheckBox(String label,Icon icon) | 构造一个复选框,用给定的标签和图片 |
JCheckBox(String label,boolean state) | 构造一个复选框,初始化时候可以选择被选中 |
boolean isSelected() | 获取复选框的选择状态 |
void setSelected(boolean state) | 设置复选框的状态 |
11.4.2 单选按钮
当用户选择另一项的时候,前一项就自动地取消,这样一组选项通常称为单选按钮
这是因为这些按钮的工作很像收音机上的电台按钮。当按下一个按钮时候,前一个按下的按钮就会自动弹起。
var group=new ButtonGroup();
var smallButton=new JRadioButton("Small",false);
group.add(samllButton);
var mediumButton=new JRadioButton("Medium",true);
group.add(mediumButton);
对于初始被选中的按钮,构造器的第二个参数为true,对于其他按钮,这个
参数为false,按钮组仅仅控制按钮的行为,如果想把按钮放在一起,需要
把他们添加到容器中和JPanel一样。
单选按钮的事件通知机制与其他按钮一样,当用户点击一个单选按钮的时候,这个按钮将产生一个动作事件。
var listener=event->lable.setFont(Font.SERIF,Font.PLAIN.size);
更因该使用单独的动作监听器,因为这样可以将大小值与按钮更紧密的绑定在一起。
buttonGroup.getSelection().getActopmCommand();获得当前选中的按钮的动作命令。
常用方法 | 方法作用 |
---|---|
JRadioButton(String label,Icon icon) | 构造一个初始没有选中的单选按钮 |
JRadioButton(String label,boolean state) | 用给定的标签和初始化状态构造一个单选按钮 |
void add(AbstractButton b) | 将按钮添加到组中 |
ButtonModel getSelection() | 返回被选中的按钮的模型 |
String getActionCommand() | 返回按钮模型的动作命令 |
void setActionCommand | 设置按钮及其模型的动作命令 |
11.4.3边框
如果在一个窗口有很多组单选按钮,就需要用可见的方式来指名哪些按钮属于同一组。
Swing提供了一组很有用的边框来解决这个问题,可以任何继承了JComponent类的组件上应用边框。
最常见的用法是在面板周围放置一个边框,然后用其他用户界面元素填充面板。
有几种不同的边框可供选择,但是使用他们的步骤完全一样
1 . 调用BorderFactory的静态方法创建边框
- 凹斜面
- 蚀刻
- 直线
- 蒙版
- 空(只是在组件外围创建一些空白空间)
2.如果愿意的话,可以给边框添加标题,具体的实现方法是将边框传递给
BorderFactory.createTitleBorder。
3.如果确实想全力地使用边框,可以调用以下的方法将几种边框组合起来:
BordeFactory.createCompoundBorder.
4.**调用JComponent类的setBorder方法将得到的边框添加到组件**
代码示例:带有标题的蚀刻边框添加到一个面板
Border etched=BorderFactory.createEtchedBorder();
Border etched=BorderFactory.createTitledBorder(etched,"A Title");
panel.setBorder(title);
不同的边框有不同的选项用于设置边框的宽度和颜色。SoftBevelBorder类用于构造有柔和拐角的斜面边框,
另外一个LineBorder类也能构造圆拐角。只能通过某个类的构造器构造这些边框,它们没有相应的BorderFactory方法。
常用方法:
方法名 | 方法作用 |
---|---|
static Border createLineBorder(Color color) | |
static Border createLineBorder(Color color,int thickness) | 创建一个简单的直线边框 |
----------------------------- | ----------------------------- |
static MatteBorder createMatteBorder(int top,int left,int bottom,int right,Color color) | 创建一个用颜色填充的粗边框 |
static MatteBorder createMatteBorder(int top,int left,int bottom,int right,Icon icon) | 创建一个用重复图标填充的粗边框 |
----------------------------- | ----------------------------- |
static Border createEmptyBorder() | 创建一个空边框 |
static Border createEmptyBorder(int top,int left ,int bottom,int right) | |
----------------------------- | ----------------------------- |
static Border createEtchedBorder() | |
static Border createEtchedBorder(Color highlight,Color shadow) | |
static Border createEtchedBorder(int style) | |
static Border createEtchedBorder(int type,Color highlight,Color shadow) | 创建一个具有3D效果的直线边框,type参数是常量EtchedBorder.RAISED和EtchedBorder.LOWERED之一 |
----------------------------- | ----------------------------- |
static Border createBevelBorder(int style) | |
static Border createBevelBorder(int style,Color highlight,Color shadow) | 创建一个具有凹面或凸面的效果的边框,type参数是BeverlBorder.LOWERED和BevelBorder.RAISED之一 |
static Border createLoweredBevelBorder() | |
static Border createRaisedBevelBorder(int style) | |
----------------------------- | ----------------------------- |
static TitledBorder createTitledBorde(String title) | |
static TitledBorder createTitledBorde(Border border) | |
static TitledBorder createTitledBorde(Border border,String title) | |
static TitledBorder createTitledBorde(Border border,String title,int justification,int postion) | |
static TitledBorder createTitledBorde(Border border,String title,int justification,int postion) | |
static TitledBorder createTitledBorde(Border border,String title,int justification,int postion,Font font) | |
static TitledBorder createTitledBorde(Border border,String title,int justification,int postion,Font font,Color color) | 创建一个具有指定属性的带标题的边框,justification参数是TitleBorder常量LEFT,CENTER,RIGHT,LEADING,TRAILING,DEFAULT_JUSTIFICATION(左对齐)之一,positon是ABOVE_TOP,TOP,BELOW_TOP,ABOVE_BOTTOM,BOTTOM,BELOW_BOTTOM或DEFAULT_POSITION(上之一) |
----------------------------- | ----------------------------- |
SoftBevelBorder(int type) | |
SoftBevelBorder(int type,Color highlight,Color shadow) | 创建一个带有柔和边角的斜面边框。type参数是BevelBorder.LOWERED和BevelBorder.RAISED之一 |
public LineBorder(Color color,int thickness,boolean roundedCorners) | 用指定的颜色和粗细创建一个直线边框.如果roundedCorners为true,则边框有圆角 |
----------------------------- | ----------------------------- |
void setBorder(Border border) | 设置这个组件的边框 |
11.4.4组合框
如果有多个选择项,使用单选按钮就不太适宜了,原因是会占据太多屏幕空间。这时就可以选择组合框当用户点击这个组件时,就下拉一个选择列表,用户可以从中选择一项。
如果想让下拉列表设置成可编辑,就可以像是一个文本域一样编辑当前的选项内容。
在java7中**JComboBox类是一个泛型类**。例如,JComboBox包含String对象,JComboBox包含整数
setEditable方法可以让组合框可编辑
调用getSelecteItem方法可以获取当前的选项,如果组合框是可编辑的,当前选项可能已经编辑过。
如果组合框是不可编辑的最好调用
combo.getItemAt(combo.getSelectedIndex());
可以调用addItem方法增加选项,
示例:
var faceCombo=new JComboBox<String>();
faceCombo.addItem("Serif");
faceCombo.addItem("SansSerif");
这个方法将字符串添加到列表的尾部,也可以利用insertItemAt方法在列表的任意位置插入新的选项:
faceCombo.InsetItemAt("Monospaced",0);//add at the beginning
可以增加任何类型的选项,组合框可以调用每个选项的toString方法显示器内容
如果要删除某些选项,可以使用removeItem或者removeItemAt方法,使用哪个方法取决于参数提供的是想要删除的选项,还是选项位置
faceComboBox.removeItem("Monospaced");
faceCombo.removeItemAt(0);//remove first item
如果需要往组合框中加大量的选项,addItem方法的性能会很差,取而代之我们可以构造一个DefaultBoxModel,并调用addElem方法可以填充这个模型,然后再调用JComboBox的setModel方法
当用户从组合框中选择一个选项时,组合框就产生一个动作事件
为了判断选择了那个选项,可以提供事件参数getSource方法来得到发送这个事件的组合框的引用,接着调用getSelectedItem方法获取当前选择的选,
需要把这个方法的返回值强制转换为适当的类型,通常是String型
示例:
ActionListener listener=event->
lable.setFont(new Font(
faceCombo.getItem(facecombo.getSelectedIndex()),Font.PLAIN,DEFAULT_SIZE
))
;
常用方法:
方法名 | 方法作用 |
---|---|
boolean isEditable() | 判断是否可以编辑 |
void setEditable() | 让组合框的下拉列表可编译 |
void addItem(Objec item) | 把一个选项添加到选项列表中 |
void insertItemAt(Object item,int index) | 将一个选项插入到选项列表的指定索引位置 |
void removeItem(Objec item) | 删除下拉列表里的一项 |
void removeAllItem(int index) | 删除指定索引位置的选项 |
void removeAllItems() | 删除下拉列表里的所有项 |
Object getSelectedIted() | 返回当前选择的项 |
getItemAt(int index) | 返回指定索引中的列表项。 |
int getSelectedIndex() | 返回与给定项目匹配的列表中的第一个项目。 |
11.4.5 滑动条
组合框可以让用户从一组离散值中选择,滑动条允许从连续的值中选择,(例如:从1~100之间选择任意数值)
构造滑动条最常用的方法:
var slider=new JSlider(min,max,initialValue);
如果忽略最小值和最大值和初始值,其默认值分别为0,100,50.
如果需要垂直的滑动条,可以按照以下方式调用构造器:
var slider=new JSlider(SwingConstants.VERTICAL,min,max,initialValue);
当用户滑动滑条时,滑动条的值就会再最小值和最大值之间变化。当值放生变化时,ChangeEvent 就会发送给所有变更监听器。为了需要的得到这些变更的通知需要调用AddChangeListener方法并且安装一个实现了ChangeListener的接口对象,在这个回调中可以获取活动条的值
ChangeListener listener=event->{
JSlider slider=(JSlider)event.getSource();
int value=slider.getValue();
};
可以通过显示刻度对滑条进行修饰:
slider.setMajorTickSpacing(20);
slider.setMinorTickSpacing(5);
上述滑动条在每20个单位的位置显示一个大刻度标记,每5个单位的位置显示一个小的刻度标记,单位就是滑动条值。
要想让刻度条可见
slider.setPaintTickets(true);
强制让刻度条对齐刻度,只要用户采用对齐模式完成托放滑动条的操作,他就hi立即自动地移动到最接近的刻度
slider.setSnapToTickets(true);
可以调用方法为大苦度添加刻度标记标签
slider.setPaintLabels(true);
隐藏滑动轨迹
slider.setPaintTrack(false);
滑动条逆向
slider.setInverted(true);
常用方法:
方法名 | 方法作用 |
---|---|
JSlider() | 构造一个水平滑条 |
JSlider(int direction) | 构造一个给定方向的水平滑条 |
JSlider(int min,int max) | 构造一个最大值,最小值的水平滑条 |
JSlider(int min,int max,int inttialValue) | 用给定的方向,最大值,最小值,和初始值构造一个水平滑条,direction参数是Swing-Constants.HORIZONTAL或SwingConstants.VERTICAL之一,默认为水平,滑动条的最小值,初始值和最大值,默认值为0,50和100 |
void setPaintTickets | 显示刻度 |
void setMajorTickSpacing(int units) | 用给定的滑动条设置最大刻度值 |
void setMinorTickSpacing(int units) | 用给定的滑动条设置最小刻度值 |
void setPaintLabels | 设置刻度值(字) |
void setLabelTable(Dictionary table) | 设置用作刻度标签的组件。表中的每一个键/值都采用new Integer/Component的格式 |
void setSnapToTicks(true) | 设置自动靠近最接近的刻度值 |
void setPaintTrack(true) | 显示滑动条滑动轨迹 |