JList从含义上看是一个列表,有点和JComboBox相似。其实不然,JComboBox的内容只能用一列显示出来,而JList的内容可以多列显示。
一,构造方法:见例子
String[] words= { "quick", "brown", "hungry", "wild"};
JList wordList = new JList(words);
参数为对象数组。
二,使用如下方法实现Jlist的多列显示:
setLayoutOrientation(参数);
参数默认为:
①JList.VERTICAL:用一列来显示,但不会自动滚动,需要添加滚动面板才能出现滚动条。
注:setVisibleRowCount(n);方法可以设置最多显示多少行(若没有添加滚动面板,此设置无效,所有内容均会显示)。
②JList.VERTICAL_WRAP:在保证行数不超过setVisibleRowCount(n)的情况下纵向排列元素。
注:此时滚动面板无效,因为行数永远不可能超标,因此滚动面板也永远不会出现。
③JList.HORIZONTAL_WRAP:同上不过是横向排列元素。
import java.awt.Font; import javax.swing.JFrame; import javax.swing.JList; public class test{ public static void main(String[] args) { // TODO Auto-generated method stub JFrame frame; String [] words={"first","second","third","forth","fifth"}; JList list=new JList(words); frame=new JFrame("test"); frame.setSize(500, 500); frame.setVisible(true); list.setFont(new Font(null, 0, 30)); list.setVisibleRowCount(3);//最多显示三行!!!!!!! list.setLayoutOrientation(JList.VERTICAL_WRAP); frame.add(list); } }
三,事件的处理
他处理的是ListSelectionEvent事件,监听器为ListSelectionListener
在这个事件处理过程中,将鼠标的操作分为2种状态:
1.按下鼠标不松手,在各个元素间拖动;
2.松开鼠标
注:当你按下鼠标后,会触发一个事件,拖动到另一个控件,又触发一个事件,继续拖动则继续触发事件,最后松手,触发一个事件。
如何区分这2种情况呢?
ListSelectionEvent提供了一个方法getValueIsAdjusting(),如果该方法返回true,则代表情况1;反之代表情况2。
注意:JList控件不提供鼠标双击元素的处理事件,若要处理鼠标双击的情况,则应该添加鼠标监听器,代码如下:
public void mouseClicked(MouseEvent evt) { if (evt.getClickCount() == 2) { JList source = (JList) evt.getSource(); Object[] selection = source.getSelectedValues(); doAction(selection); } }
四,以ListModel方式创建JList
数据模型顾名思义是负责显示数据的,也就是说JList的数据都是从这个模型里取的,数据模型在swing中是比较经典的用法,很多重要的组件都有对应的数据模型mode
数据模型分为两种:
一种是继承AbstractListModel,一种是DefaultListModel
public class t { public static void main(String[] args) { JFrame f = new JFrame(); f.setSize(600, 500); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JPanel panel = new JPanel(); JScrollPane scrollPane = new JScrollPane(); scrollPane.setPreferredSize(new Dimension(200,100)); //以数据模型构造方法创建 final JList jList = new JList(new MyListModel()); jList.addListSelectionListener(new ListSelectionListener(){ @Override public void valueChanged(ListSelectionEvent e) { if(!jList.getValueIsAdjusting()){ //设置只有释放鼠标时才触发 System.out.println(jList.getSelectedValue()); } } }); scrollPane.setViewportView(jList); panel.add(scrollPane); f.getContentPane().add(panel); f.setVisible(true); } } //列表数据模型 class MyListModel extends AbstractListModel{ @Override public Object getElementAt(int index) { // TODO Auto-generated method stub return index; } @Override public int getSize() { // TODO Auto-generated method stub return 100; } }
public class t { public static void main(String[] args) { JFrame f = new JFrame(); f.setSize(600, 500); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JPanel panel = new JPanel(); JScrollPane scrollPane = new JScrollPane(); scrollPane.setPreferredSize(new Dimension(200,100)); final DefaultListModel d = new DefaultListModel();//只有默认的模型有添加/删除方法 d.addElement("aa"); d.addElement("bb"); final JList jList = new JList(d); jList.addListSelectionListener(new ListSelectionListener(){ @Override public void valueChanged(ListSelectionEvent e) { if(!jList.getValueIsAdjusting()){ //设置只有释放鼠标时才触发 System.out.println(jList.getSelectedValue()); } } }); scrollPane.setViewportView(jList); panel.add(scrollPane); f.getContentPane().add(panel); f.setVisible(true); } }
转自:
http://bbs.csdn.net/topics/350130389
http://blog.csdn.net/he_chenjun/article/details/9128965#