swing的列表框_不强制存储列表项
不强制存储列表项的ListModel和ComboBoxModel
与JProgressBar一样,JList和JComboBox也采用了MVC的设计模式,JList和JComboBox只负责外观的显示,而组件底层的状态数据则由对应的Model对象来维护。JList对应的Model是ListModel接口,JComboBox对应的Model是ComboBox接口,其代码如下:
xxxxxxxxxxpublic interface ListModel<E> { //获取列表项的个数 int getSize(); //获取指定索引处的列表项 E getElementAt(int index); //监听器 void addListDataListener(ListDataListener l); //监听器 void removeListDataListener(ListDataListener l);}
public interface ComboBoxModel<E> extends ListModel<E> { //设置当前的列表项 void setSelectedItem(Object anItem); //获取当前的列表项 Object getSelectedItem();}从上面接口ListModel
在使用JList和JComboBox时,除了可以使用jdk提供的Model实现类,程序员自己也可以根据需求,自己定义Model的实现类,实现对应的方法使用
swing的列表框_不强制存储列表项的练习
xxxxxxxxxxpackage ch30;
import model.a_21_1NumberListModel;import model.a_21_3NumberComboBoxListModel;
import javax.swing.*;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.math.BigDecimal;import java.util.List;
public class a_21_2ListModelTest {
JFrame jf = new JFrame("测试ListModel");
//根据NumberListModel对象创建一个JList。参数:开始值、结束值、步长 JList<BigDecimal> jList = new JList<>(new a_21_1NumberListModel(new BigDecimal(1),new BigDecimal(21),new BigDecimal(2))); //根据NumberComboBoxModel对象创建一个JComboBox。参数:开始值、结束值、步长 JComboBox<BigDecimal> jComboBox = new JComboBox<>(new a_21_3NumberComboBoxListModel(new BigDecimal(0.1),new BigDecimal(1.2),new BigDecimal(0.1)));
//文本框。15列 JTextField jTextField = new JTextField(15);
JLabel label = new JLabel("您选择的值是:");
//组装视图 public void init() {
//设置jList的可视高度为4,即列表框一次最多只能显示4个列表项 jList.setVisibleRowCount(4); //默认选中第三项到第五项 jList.setSelectionInterval(2, 4);//注意起始下标是0 //设置列表框里面的每个列表项具有指定高度和宽度,单位是像素 jList.setFixedCellHeight(30); jList.setFixedCellWidth(90);
//当用户点击列表框会触发的事件 jList.addListSelectionListener(new ListSelectionListener() { public void valueChanged(ListSelectionEvent e) { //获取用户选中的所有数字 List<BigDecimal> selectedValuesList = jList.getSelectedValuesList(); //清空文本框 jTextField.setText(""); //增强for遍历集合 for (BigDecimal item : selectedValuesList) { //jTextField.getText()是原本的条目内容,item.toString()是当前的条目内容 jTextField.setText(jTextField.getText() + item.toString() + ", "); } } });
//设置jComboBox的可视高度为5,即下拉列表框一次最多只能显示5个列表项 jComboBox.setMaximumRowCount(5); //当用户点击下拉列表框会触发的事件 jComboBox.addItemListener(new ItemListener() { public void itemStateChanged(ItemEvent e) { //获取用户当前选中的某个条目 Object value = jComboBox.getSelectedItem(); //把当前的条目(即列表项,我们的列表项是int类型的数字)转换成字符串并添加到文本框 jTextField.setText(value.toString()); } }); Box hBox = Box.createHorizontalBox(); hBox.add(new JScrollPane(jList));//new JScrollPane(jList)表示的是我们给这个文本框加了一个滚动条 //把下拉列表框先放到Panel里面 JPanel tempPanel = new JPanel(); tempPanel.add(jComboBox); hBox.add(tempPanel); //把组装好的顶部区域放到整个窗口的中间区域 jf.add(hBox);
//组装底部 JPanel bottomPanel = new JPanel(); bottomPanel.add(label); bottomPanel.add(jTextField); //把组装好的底部区域放到整个窗口的南部区域 jf.add(bottomPanel, BorderLayout.SOUTH);
//设置窗口的最佳大小,设置窗口可见,设置点击叉号就退出程序 jf.pack(); jf.setVisible(true); jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); }
public static void main(String[] args) { new a_21_2ListModelTest().init(); }
}