2015-01-02 17:11:44|?次阅读|上传:wustguangh【已有?条评论】发表评论
关键词:Java, 界面设计|来源:唯设编程网
JList是一个列表组件,有点和JComboBox相似。其实不然,JComboBox的内容只能用一列显示出来,而JList的内容可以多列显示。本文介绍这个这个Swing组件的使用方法。
最简单的方法是使用一个数组(Array)或者Vector作为参数进行构造,如下所示:
String[] words= { "quick", "brown", "hungry", "wild"}; JList wordList = new JList(words);
这种方法用起来非常简单,特别适合于列表内容不变的场合,但是,如果JList的内容需要动态变化,个人建议使用DefaultListModel作为参数构造JList:
JList<String> snapList = new JList<String>(new DefaultListModel<String>());
这样,你只需要处理对应的数据模型(DefaultListModel)则可以实现其列表内容的增加和删除操作。
如何构造参数使用的是DefaultListModel,则可以对其列表项进行动态增加/删除,如果使用的构造参数是数组或者Vector,则JList的内容是无法动态增加/删除的。也许你会认为:我用一个数组构造JList,那么我只要将数组中的元素增加或减少,那么JList的内容自然会增加或减少。这绝对是个错误的认识,对数组内容的修改不会影响到JList。
下面是清空列表项的实例代码:
DefaultListModel<String> listModel = (DefaultListModel<String>) snapList.getModel(); //清空 listModel.removeAllElements();
下面是一段增加列表项的代码:
for (String item : items) { listModel.addElement(item); }
与其他控件不同,他处理的不是Action事件,而是ListSelectionEvent事件,监听器为ListSelectionListener。在这个事件处理过程中,又将鼠标的操作分为2种状态:1.按下鼠标不松手,在各个元素间拖动;2.松开鼠标。也就是说,当你按下鼠标后,会触发一个事件,拖动到另一个控件,又触发一个事件,继续拖动则继续触发事件,最后松手,触发一个事件。那么,你如何区分这2种情况呢?ListSelectionEvent提供了一个方法getValueIsAdjusting(),如果该方法返回true,则代表情况1;反之代表情况2。下面的代码为JList增加了ListSelectionListener监听器:
//快照列表选择事件 snapList.addListSelectionListener(new ListSelectionListener() { @Override public void valueChanged(ListSelectionEvent e) { String selValue = snapList.getSelectedValue(); if(selValue != null){ if(selValue.equals("最新")) SummaryPanel.this.delSnapBtn.setEnabled(false); else SummaryPanel.this.delSnapBtn.setEnabled(true); htmlPane.setText(generateHTML(selValue)); }else{ SummaryPanel.this.delSnapBtn.setEnabled(false); } } });