swing的列表框
JList、JComboBox实现列表框: 无论从哪个角度来看,JList和JComboBox都是极其相似的,它们都有一个列表框,只是JComboBox的列表框需要以下拉方式显示出来; JList和JComboBox都可以通过调用setRendererO方法来改变列表项的表现形式。甚至维护这两个组件的Model都是相似的, JList使用ListModel, JComboBox使用ComboBoxModel,而ComboBoxModel是ListModel的子类
我们要学的列表框有两种,如下 1、JList列表框:不需要任何操作,默认就是展开的,我们可以看到该列表框的多个条目(条目也就是列表项) 2、JComboBox下拉选中列表框:需要用户点击小按钮才会展示改列表
使用JList或JComboBox实现简单列表框的步骤:
第一步:创建JList或JComboBox对象,如下是两种列表框的构造方法:
JList(final E[] listData):创建JList对象,把listData数组中的每项内容转换成一个列表项展示
JList(final Vector<? extends E> listData):创建JList对象,把listData数组中的每项内容转换成一个列表项展示,其中Vector是集合
JComboBox(E[] items):JComboBox(Vector
第二步:设置JList或JComboBox的外观行为,如下是两种列表框的成员方法:
【JList】 addSelectionInterval(int anchor, int lead):在已经选中列表项的基础上,增加选中从anchor到lead索引范围内的所有列表项 setFixedCellHeight(int height)/setFixedCellWidth(int width):设置列表项的高度和宽度 setLayoutOrientation(int layoutOrientation):设置列表框的布局方向 setSelectedIndex(int index):设置默认选中项 setSelectedIndices(int[] indices):设置默认选中的多个列表项 setSelectedValue(Object anObject,boolean shouldScroll):设置默认选中项,并滚动到该项显示 setSelectionBackground(Color selectionBackground):设置选中项的背景颜色 setSelectionForeground(Color selectionForeground):设置选中项的前景色 setSelectionInterval(int anchor, int lead):设置从anchor到lead范围内的所有列表项被选中 setSelectionMode(int selectionMode):设置选中模式,默认没有限制,也可以设置为单选或者区域选中 setVisibleRowCount(int visibleRowCount):设置列表框的可视高度,即一页显示多少行列表项
【JComboBox】 setEditable(boolean aFlag):设置是否可以直接修改或编辑列表文本框的值,默认为不可以 setMaximumRowCount(int count):设置列表框的可视高度,即一页显示多少行列表项 setSelectedIndex(int anIndex):设置默认选中项 setSelectedItem(Object anObject):根据列表项的值,设置默认选中项
第三步:设置监听器,监听列表框的列表项的变化 JList通过addListSelectionListener完成,JComboBox通过addItemListener完成
swing的列表框_练习
xxxxxxxxxx
package ch30;
import javax.swing.*;
import javax.swing.border.EtchedBorder;
import javax.swing.border.TitledBorder;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import java.awt.*;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.util.List;
import java.util.Vector;
public class a_20_0swing_列表框 {
//窗口对象
JFrame jf = new JFrame("列表框测试");
//列表框的图书书名数据
String[] books = {"java自学宝典", "轻量级javaEE企业应用实战", "Android基础教程", "jQuery实战教程", "SpringBoot企业级开发"};
//定义布局选择按钮所在的面板,存放'纵向滚动'、‘纵向换行’、‘横向换行’这三个按钮
JPanel layoutPanel = new JPanel();
//要使上面那三个按钮能实现单选,就把那三个按钮放到一个组里
ButtonGroup layoutGroup = new ButtonGroup();
//定义选择模式按钮所在面板,存放‘无限制’、‘单选’、‘单范围’这三个按钮
JPanel selectModePanel = new JPanel();
//要使上面那三个按钮能实现单选,就把那三个按钮放到一个组里
ButtonGroup selectModeGroup = new ButtonGroup();
//窗口底部的文本域
JTextArea favorite = new JTextArea(4, 40);
//左上角的列表框。注意这里还没有初始化,我们会在组装视图里对它进行初始化
JList<String> bookList;
//右上角的下拉列表框
JComboBox<String> bookSelector;
//组装视图
public void init() {
//初始化bookList,也就是我们最左上角的列表框的列表项(列表项也叫条目),它的参数是一个数组,我们上面定义过一个数组books,传进去就完成了初始化
bookList = new JList<>(books);
//在'确定选项布局'标题边框里面添加三个按钮,直接调用我们最下面封装好的方法即可。参数:按钮名字、选项布局类型
addBtn2LayoutPanel("纵向滚动", JList.VERTICAL);//VERTICAL就是纵向滚动
addBtn2LayoutPanel("纵向换行", JList.VERTICAL_WRAP);//VERTICAL_WRAP就是纵向换行
addBtn2LayoutPanel("横向换行", JList.HORIZONTAL_WRAP);//HORIZONTAL_WRAP就是横向换行
//在'确定选择模式'标题边框里面添加三个按钮,直接调用我们最下面封装好的方法即可.参数:按钮名字、选择模式
addBtn2SelectModelPanel("无限制", ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
addBtn2SelectModelPanel("单选", ListSelectionModel.SINGLE_SELECTION);//SINGLE_SELECTION就是单选
addBtn2SelectModelPanel("单范围", ListSelectionModel.SINGLE_INTERVAL_SELECTION);
//设置JList的可视高度为3,即左上角的列表框一次最多只能显示3个列表项
bookList.setVisibleRowCount(3);
//设置Jlist的默认选中是第三项到第五项,这个项就是我们上面那行的列表框的列表项,即书名,我们总共有5个书名
bookList.setSelectionInterval(2, 4);//注意起始下标是0
//创建一个纵向的Box,把上面的列表框、'确定选项布局'标题边框、'确定选择模式'标题边框都放进这个Box
Box bookListVBox = Box.createVerticalBox();
bookListVBox.add(new JScrollPane(bookList));//new JScrollPane(bookList)表示我们在列表框里面加了滚动条
bookListVBox.add(layoutPanel);
bookListVBox.add(selectModePanel);
//事件监听器,当选中左上角的选择框的某个条目(也叫列表项)时,会触发的事件
bookList.addListSelectionListener(new ListSelectionListener() {
public void valueChanged(ListSelectionEvent e) {
//获取当前用户选中的条目。难点:当用户多选时,我们要获取的是多个。解决:使用List集合获取用户选择的条目
List<String> selectedValuesList = bookList.getSelectedValuesList();
//把当前条目的内容设置到文本域中
favorite.setText("");
for (String s : selectedValuesList) {//增强for遍历
favorite.append(s + "");//添加到文本域,当用户多选时会产生多个条目,我们把多个条目用空格隔开
}
}
});
//由于下面那部分的JComboBox对象需要的参数是Vector集合,所以我们在这里要创建一个Vector集合,并提供数据
Vector<String> vector = new Vector<>();
//把数据提供在List集合里面
List<String> list = List.of("java自学宝典", "轻量级javaEE企业应用实战", "Android基础教程", "jQuery实战教程", "SpringBoot企业级开发");
vector.addAll(list);//把上面那行list集合的所有数据都传到我们的vector集合里面
//组装JComboBox,即窗口右上角的下拉选择框。下面那个vector集合是我们上面一行写好的
//可以直接传数组,也可以传Vector集合。我们已经在左上角的列表框里面传的是数组,这次我们右上角就用传集合的写法
bookSelector = new JComboBox<>(vector);
//事件监听器,当选中右上角的下拉选择框的某个条目(也叫列表项)时,会触发的事件
bookSelector.addItemListener(new ItemListener() {
public void itemStateChanged(ItemEvent e) {
//获取当前已经选择中的条目
Object selectedItem = bookSelector.getSelectedItem();
//把当前条目的内容设置到文本域中
favorite.setText(selectedItem.toString());//下拉选择框用户只能选一个条目,所以不存在多条目被选中的问题
}
});
//设置JComboBox的列表项可编辑,即右上角的下拉列表框
bookSelector.setEditable(true);
//设置JList的可视高度为3,即右上角的下拉列表框一次最多只能显示3个列表项
bookSelector.setMaximumRowCount(4);
Box topBox = Box.createHorizontalBox();//即顶部区域是水平排列,也叫左右排列
//上面那行左边区域的是'左上角列表框‘、’确定选项布局‘、’确定选择模式‘。上面那行右边区域的是’右上角的下拉选择框‘。如下
topBox.add(bookListVBox);
JPanel bookSelectPanel = new JPanel();
bookSelectPanel.add(bookSelector);
topBox.add(bookSelectPanel);
//组装最底部的文本域
JPanel bottomPanel = new JPanel();
//修改上面那行的bottomPanel的布局为垂直布局,即修改为BorderLayout
bottomPanel.setLayout(new BorderLayout());
//把一行文字添加到bottomPanel区域的北部
bottomPanel.add(new JLabel("您最喜欢的图书:"), BorderLayout.NORTH);
bottomPanel.add(new JScrollPane(favorite));//new JScrollPane(favorite)表示的是我们给这个文本域加了一个滚动条
//组装整体,整体的布局修改为垂直布局,即上下区域
Box holeBox = Box.createVerticalBox();
//上面那行的上面区域是我们已经组装好的topBox上面那行的下面区域是,上面那一部分刚组装好的bottomPanel
holeBox.add(topBox);
holeBox.add(bottomPanel);
//把整体放到我们的窗口里面
jf.add(holeBox);
//设置窗口的最佳大小,设置窗口可见,设置点击叉号就退出程序
jf.pack();
jf.setVisible(true);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
//封装‘确定选项布局’标题边框的按钮方法,由于有3个按钮,一个个写太麻烦,所以我们就在这里封装了方法。参数:按钮名字、选项布局类型
public void addBtn2LayoutPanel(String name, int layoutType) {
//设置标题边框
layoutPanel.setBorder(new TitledBorder(new EtchedBorder(), "确定选项布局"));
//创建单选按钮
JRadioButton button = new JRadioButton(name);
layoutPanel.add(button);
//默认选中第一个按钮.通过获取当前按钮组里面有多少个按钮来判断,如果等于0,就表示当前添加的按钮就是第一个
if (layoutGroup.getButtonCount() == 0) {
button.setSelected(true);//默认选中
}
//要实现单选的效果的话,还需要把上面那个button添加到layoutGroup组里面
layoutGroup.add(button);
//按钮点击事件
button.addActionListener(e -> {
///改变列表框里列表项的布局方向
bookList.setLayoutOrientation(layoutType);//layoutType参数是我们这个addBtn2LayoutPanel方法的参数,即选项布局类型
});
}
//封装‘确定选择模式’标题边框的按钮方法,由于有3个按钮,一个个写太麻烦,所以我们就在这里封装了方法。参数:按钮名字、选择模式
public void addBtn2SelectModelPanel(String name, int selectMode) {
//设置标题边框
selectModePanel.setBorder(new TitledBorder(new EtchedBorder(), "确定选择模式"));
//创建单选按钮
JRadioButton button = new JRadioButton(name);
selectModePanel.add(button);
//默认选中第一个按钮.通过获取当前按钮组里面有多少个按钮来判断,如果等于0,就表示当前添加的按钮就是第一个
if (selectModeGroup.getButtonCount() == 0) {
button.setSelected(true);//默认选中
}
//要实现单选的效果的话,还需要把上面那个button添加到layoutGroup组里面
selectModeGroup.add(button);
//按钮点击事件
button.addActionListener(e -> {
bookList.setSelectionMode(selectMode);//selectMode参数是我们这个addBtn2SelectModelPanel方法的参数,即选择模式
});
}
public static void main(String[] args) {
new a_20_0swing_列表框().init();
}
}