Java Swing编程:微调控制器和列表框

开发 后端
今天主要讲下JSpinner和JList。JSpinner用的不多,一般都用滚动条来代替,但当值要精确时,用滚动条会经常滚不到自己要的值,这也是很尴尬的,这时JSpinner就派上用场了。

今天主要讲下JSpinner和JList。JSpinner用的不多,一般都用滚动条来代替,但当值要精确时,用滚动条会经常滚不到自己要的值,这也是很尴尬的,这时JSpinner就派上用场了。

其实JSpinner没什么花样,主要构造时要传个SpinnerModel,这个类有3个子类

SpinnerNumberModel用于设置数值型的JSpinner

SpinnerDateModel用于实现时间控件的微调

SpinnerListModel用于传入List或数组之间的微调,eg

  1. public class TestJSpinner  
  2. {  
  3.     final int SPINNER_NUM = 6;  
  4.     JFrame mainWin = new JFrame("微调控制器示范");  
  5.     Box spinnerBox = new Box(BoxLayout.Y_AXIS);  
  6.     JSpinner[] spinners = new JSpinner[SPINNER_NUM];  
  7.     JLabel[] valLabels = new JLabel[SPINNER_NUM];  
  8.     JButton okBn = new JButton("确定");  
  9.     public void init()   
  10.     {  
  11.         for (int i = 0 ; i < SPINNER_NUM ; i++ )  
  12.         {  
  13.             valLabels[i] = new JLabel();  
  14.         }  
  15.         //-----------普通Spinner-----------  
  16.         spinners[0] = new JSpinner();  
  17.         addSpinner(spinners[0], "普通" , valLabels[0]);  
  18.  
  19.         //-----------指定最小值、最大值、步长的Spinner-----------  
  20.         //创建一个SpinnerNumberModel对象,指定最小值、最大值和步长  
  21.         SpinnerNumberModel numModel = new SpinnerNumberModel(3.4,   
  22.             -1.14.30.1);   
  23.         spinners[1] = new JSpinner(numModel);  
  24.         addSpinner(spinners[1], "数 值 范 围" , valLabels[1]);  
  25.  
  26.         //-----------使用SpinnerListModel的Spinner------------  
  27.         String[] books = new String[]  
  28.         {  
  29.             "轻量级J2EE企业应用实战",  
  30.             "Struts2权威指南",  
  31.             "基于J2EE的Ajax宝典" 
  32.         };  
  33.         //使用字符串数组创建SpinnerListModel对象  
  34.         SpinnerListModel bookModel = new SpinnerListModel(books);  
  35.         //使用SpinnerListModel对象创建JSpinner对象  
  36.         spinners[2] = new JSpinner(bookModel);  
  37.         addSpinner(spinners[2], "字符串序列值" , valLabels[2]);  
  38.  
  39.         //-----------使用序列值是ImageIcon的Spinner------------  
  40.         ArrayList<ImageIcon> icons = new ArrayList<ImageIcon>();  
  41.         icons.add(new ImageIcon("a.gif"));  
  42.         icons.add(new ImageIcon("b.gif"));  
  43.         //使用ImageIcon数组创建SpinnerListModel对象  
  44.         SpinnerListModel iconModel = new SpinnerListModel(icons);  
  45.         //使用SpinnerListModel对象创建JSpinner对象  
  46.         spinners[3] = new JSpinner(iconModel);  
  47.         addSpinner(spinners[3], "图标序列值" , valLabels[3]);  
  48.  
  49.         //-----------使用SpinnerDateModel的Spinner------------  
  50.         //分别获取起始时间、结束时间、初时时间  
  51.         Calendar cal = Calendar.getInstance();  
  52.         Date init = cal.getTime();  
  53.         cal.add(Calendar.DAY_OF_MONTH , -3);  
  54.         Date start = cal.getTime();  
  55.         cal.add(Calendar.DAY_OF_MONTH , 8);  
  56.         Date end = cal.getTime();  
  57.         //创建一个SpinnerDateModel对象,指定最小时间、最大时间和初始时间  
  58.         SpinnerDateModel dateModel = new SpinnerDateModel(init ,   
  59.             start , end , Calendar.HOUR_OF_DAY);  
  60.         //以SpinnerDateModel对象创建JSpinner  
  61.         spinners[4] = new JSpinner(dateModel);  
  62.         addSpinner(spinners[4], "时 间 范 围" , valLabels[4]);  
  63.  
  64.         //-----------使用DateEditor来格式化Spinner------------  
  65.         dateModel = new SpinnerDateModel();  
  66.         spinners[5] = new JSpinner(dateModel);  
  67.         //创建一个JSpinner.DateEditor对象,用于对指定Spinner进行格式化  
  68.         JSpinner.DateEditor editor = new JSpinner.DateEditor(spinners[5],  
  69.             "公元yyyy年MM月dd日 HH时");  
  70.         //设置使用JSpinner.DateEditor对象进行格式化  
  71.         spinners[5].setEditor(editor);  
  72.         addSpinner(spinners[5], "使用DateEditor" , valLabels[5]);  
  73.         //为“确定”按钮添加一个事件监听器  
  74.         okBn.addActionListener(new ActionListener()  
  75.         {  
  76.             public void actionPerformed(ActionEvent evt)  
  77.             {  
  78.                 //取出每个微调控制器的值,并将该值用后面的Label标签显示出来。  
  79.                 for (int i = 0 ; i < SPINNER_NUM ; i++)  
  80.                 {  
  81.                     valLabels[i].setText(spinners[i].getValue().toString());  
  82.                 }  
  83.             }  
  84.         });  
  85.  
  86.         JPanel bnPanel = new JPanel();  
  87.         bnPanel.add(okBn);  
  88.         mainWin.add(spinnerBox, BorderLayout.CENTER);  
  89.         mainWin.add(bnPanel, BorderLayout.SOUTH);  
  90.         mainWin.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  
  91.         mainWin.pack();  
  92.         mainWin.setVisible(true);  
  93.       
  94.     }  
  95.     //定义一个方法,用于将滑动条添加到容器中  
  96.     public void addSpinner(JSpinner spinner, String description  
  97.         ,JLabel valLabel)  
  98.     {  
  99.         Box box = new Box(BoxLayout.X_AXIS);  
  100.         JLabel desc = new JLabel(description + ":");  
  101.         desc.setPreferredSize(new Dimension(100 , 30));  
  102.         box.add(desc);  
  103.         box.add(spinner);  
  104.         valLabel.setPreferredSize(new Dimension(180 , 30));  
  105.         box.add(valLabel);  
  106.         spinnerBox.add(box);  
  107.     }  
  108.     public static void main(String[] args)  
  109.     {  
  110.         new TestJSpinner().init();  
  111.     }  

相比前面的Jspinner来说,JList和JComboBox就用的多些,eg

  1. public class TestList  
  2. {  
  3.     private JFrame mainWin = new JFrame("测试列表框");  
  4.     String[] books = new String[]  
  5.     {  
  6.         "Spring2.0宝典",  
  7.         "轻量级J2EE企业应用实战",  
  8.         "基于J2EE的Ajax宝典",  
  9.         "Struts2权威指南",  
  10.         "ROR敏捷开发最佳实践" 
  11.     };  
  12.     JList bookList = new JList(books);  
  13.     JComboBox bookSelector;  
  14.     //定义布局选择按钮所在的面板  
  15.     JPanel layoutPanel = new JPanel();  
  16.     ButtonGroup layoutGroup = new ButtonGroup();  
  17.     //定义选择模式按钮所在的面板  
  18.     JPanel selectModePanel = new JPanel();  
  19.     ButtonGroup selectModeGroup = new ButtonGroup();  
  20.     JTextArea favoriate = new JTextArea(4 , 40);  
  21.  
  22.     public void init()  
  23.     {  
  24.         //JList的可视高度可同时显示三个列表项  
  25.         bookList.setVisibleRowCount(3);   
  26.         //默认选中第三项到第五项(第一项的索引是0)  
  27.         bookList.setSelectionInterval(24);  
  28.         addLayoutButton("纵向滚动", JList.VERTICAL);  
  29.         addLayoutButton("纵向换行", JList.VERTICAL_WRAP);  
  30.         addLayoutButton("横向换行", JList.HORIZONTAL_WRAP);  
  31.         addSelectModelButton("无限制", ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);  
  32.         addSelectModelButton("单选", ListSelectionModel.SINGLE_SELECTION);  
  33.         addSelectModelButton("单范围", ListSelectionModel.SINGLE_INTERVAL_SELECTION);  
  34.         Box listBox = new Box(BoxLayout.Y_AXIS);  
  35.         //将JList组件放在JScrollPane中,再将该JScrollPane添加到listBox容器中  
  36.         listBox.add(new JScrollPane(bookList));  
  37.         //添加布局选择按钮面板、选择模式按钮面板  
  38.         listBox.add(layoutPanel);  
  39.         listBox.add(selectModePanel);  
  40.         //为JList添加事件监听器  
  41.         bookList.addListSelectionListener(new ListSelectionListener()  
  42.         {  
  43.             public void  valueChanged(ListSelectionEvent e)  
  44.             {  
  45.                 //获取用户所选择的所有图书  
  46.                 Object[] books = bookList.getSelectedValues();  
  47.                 favoriate.setText("");  
  48.                 for (Object book : books )  
  49.                 {  
  50.                     favoriate.append(book.toString() + "/n");  
  51.                 }  
  52.             }  
  53.         });  
  54.  
  55.         Vector<String> bookCollection = new Vector<String>();  
  56.         bookCollection.add("Spring2.0宝典");  
  57.         bookCollection.add("轻量级J2EE企业应用实战");  
  58.         bookCollection.add("基于J2EE的Ajax宝典");  
  59.         bookCollection.add("Struts2权威指南");  
  60.         bookCollection.add("ROR敏捷开发最佳实践");  
  61.         //用一个Vector对象来创建一个JComboBox对象  
  62.         bookSelector = new JComboBox(bookCollection);  
  63.         //为JComboBox添加事件监听器  
  64.         bookSelector.addItemListener(new ItemListener()  
  65.         {  
  66.             public void itemStateChanged(ItemEvent e)   
  67.             {  
  68.                 //获取JComboBox所选中的项  
  69.                 Object book = bookSelector.getSelectedItem();  
  70.                 favoriate.setText(book.toString());  
  71.             }  
  72.         });  
  73.           
  74.         //设置可以直接编辑  
  75.         bookSelector.setEditable(true);  
  76.         //设置下拉列表框的可视高度可同时显示4个列表项  
  77.         bookSelector.setMaximumRowCount(4);  
  78.  
  79.  
  80.         JPanel p = new JPanel();  
  81.         p.add(bookSelector);  
  82.         Box box = new Box(BoxLayout.X_AXIS);  
  83.         box.add(listBox);  
  84.         box.add(p);  
  85.         mainWin.add(box);  
  86.         JPanel favoriatePanel = new JPanel();  
  87.         favoriatePanel.setLayout(new BorderLayout());  
  88.         favoriatePanel.add(new JScrollPane(favoriate));  
  89.         favoriatePanel.add(new JLabel("您喜欢的图书:") , BorderLayout.NORTH);  
  90.         mainWin.add(favoriatePanel , BorderLayout.SOUTH);  
  91.  
  92.           
  93.         mainWin.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  
  94.         mainWin.pack();  
  95.         mainWin.setVisible(true);  
  96.     }  
  97.  
  98.     private void addLayoutButton(String label, final int orientation)  
  99.     {  
  100.         layoutPanel.setBorder(new TitledBorder(new EtchedBorder(), "确定选项布局"));  
  101.         JRadioButton button = new JRadioButton(label);  
  102.         //把该单选按钮添加到layoutPanel面板中  
  103.         layoutPanel.add(button);  
  104.         //默认选中第一个按钮  
  105.         if (layoutGroup.getButtonCount() == 0)   
  106.             button.setSelected(true);  
  107.         layoutGroup.add(button);  
  108.         button.addActionListener(new ActionListener()  
  109.         {  
  110.             public void actionPerformed(ActionEvent event)  
  111.             {  
  112.                 //改变列表框里列表项的布局方向  
  113.                 bookList.setLayoutOrientation(orientation);  
  114.             }  
  115.         });  
  116.     }  
  117.     private void addSelectModelButton(String label, final int selectModel)  
  118.     {  
  119.         selectModePanel.setBorder(new TitledBorder(new EtchedBorder(), "确定选择模式"));  
  120.         JRadioButton button = new JRadioButton(label);  
  121.         //把该单选按钮添加到selectModePanel面板中  
  122.         selectModePanel.add(button);  
  123.         //默认选中第一个按钮  
  124.         if (selectModeGroup.getButtonCount() == 0)   
  125.             button.setSelected(true);  
  126.         selectModeGroup.add(button);  
  127.         button.addActionListener(new ActionListener()  
  128.         {  
  129.             public void actionPerformed(ActionEvent event)  
  130.             {  
  131.                 //改变列表框里的选择模式  
  132.                 bookList.setSelectionMode(selectModel);  
  133.             }  
  134.         });  
  135.     }  
  136.  
  137.     public static void main(String[] args)   
  138.     {  
  139.         new TestList().init();  
  140.     }  

JList和JComboBox除了样子上的区别,就是JComboBox只支持单选,而JList可以多选。

原文链接:http://blog.csdn.net/terryzero/article/details/3820172

【编辑推荐】

  1. Java Swing编程:进度条和滑动条
  2. Java Swing编程:Applet和JApplet
  3. Java Swing编程:拖放功能
  4. Java Swing编程:特殊容器
  5. Java Swing编程:基本组件
责任编辑:林师授 来源: terryzero的博客
相关推荐

2009-07-16 13:26:32

Swing增加

2010-01-26 09:27:47

Android列表框

2024-09-27 16:28:07

2015-02-02 09:37:42

SDN控制器

2012-01-17 13:53:16

JavaSwing

2009-01-12 11:16:58

控制器控制器行为行为结果

2011-07-14 10:28:54

额外域控制器

2023-11-19 18:46:04

智能控制器芯片

2015-08-07 15:28:46

选取城市控制器源码

2023-08-13 18:31:45

SDN控制器

2011-07-13 09:00:59

域控制器Active Dire

2011-07-12 09:29:10

主域控制器备份域控制器

2013-11-18 10:32:37

SQL Server 资源调控器对IOPS控制

2012-01-17 13:41:34

JavaSwing

2012-01-17 14:09:54

JavaSwing

2012-01-17 14:05:29

JavaSwing

2012-01-17 13:46:55

JavaSwing

2012-01-17 13:58:17

JavaSwing

2013-12-19 09:32:01

SDN南向网络控制

2011-07-13 10:29:44

域控制器
点赞
收藏

51CTO技术栈公众号