JList的事件处理一般可分为两种:一种是取得用户选取的项目;另一种是在JList的项目上双击鼠标两次,运行相对应的工作。我 们先来看第一种事件处理方式:
在JList类中有addListSelectionListener()方法,可以检测用户是否对JList的选取有任何的改变。ListSelectionListener interface中只有定义一个方法,那就是valueChanged(ListSelectionEvent e),我们必须实作这个方法,才能在用户改变选取值时 取得用户最后的选取状态。我们来看一下的例子: 这个例子匀们抓取用户所选取的项目,并将所选的项目显示在JLabel上。
import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.event.*;//由于ListSelectionEvent是swing的事件,不是awt的事件,因此我们必须import //javax.swing.event.*。 public class JList7 implements ListSelectionListener { JList list = null; JLabel label = null; String[] s = {"美国","日本","大陆","英国","法国","意大利","澳洲","韩国"}; public JList7() { JFrame f = new JFrame("JList"); Container contentPane = f.getContentPane(); contentPane.setLayout(new BorderLayout()); label = new JLabel(); list = new JList(s); list.setVisibleRowCount(5); list.setBorder(BorderFactory.createTitledBorder("您最喜欢到哪个国家玩呢?")); list.addListSelectionListener(this); contentPane.add(label,BorderLayout.NORTH); contentPane.add(new JScrollPane(list),BorderLayout.CENTER); f.pack(); f.show(); f.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); } public static void main(String args[]) { new JList7(); } public void valueChanged(ListSelectionEvent e) { int tmp = 0; String stmp = "您目前选取:"; int[] index = list.getSelectedIndices();//利用JList类所提供的getSelectedIndices()方法可得到用户所选取的所有 for(int i=0; i < index.length ; i++)//index值,这些index值由一个int array返回. { tmp = index[i]; stmp = stmp+s[tmp]+" "; } label.setText(stmp); } }
接下来,我们来看如何处理在JList上双击鼠标的操作。由于JList本身并无提供这样的EventListener,因此我们必须利用 MouseListener来达到捕获双击鼠标的事件。至于要怎么知道我们到底在哪个项目上双击鼠标呢?我们可以利用JList类所提供的 LocatToindex()方法得知。以下为我们所举的范例:
这个例子一开始左边列有国这名称,当你在某个国家名称上双击鼠标,这个国家名称就会移到右边去,反之亦同。
1.这个范例我们应用DefaultListModel类,因主DefaultListModel类实作了Vector中的方法,使我们在处理动态的JList项目值 比较容易.
2.由于我们要处理鼠标事件,为了编写方便,在程序中我们继承MouseAdapte抽象类.
3.在程序中,我们建立两个DataModel,第一个JList,也就是list1一开始时会将String Array s中的所有值依次放入list1的项 目中,而list2一开始为空白。
import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.event.*; public class JList8 extends MouseAdapter { JList list1 = null; JList list2 = null; DefaultListModel mode1 = null; DefaultListModel mode2 = null; String[] s = { "美国", "日本", "大陆", "英国", "法国", "意大利", "澳洲", "韩国" }; public JList8() { JFrame f = new JFrame("JList"); Container contentPane = f.getContentPane(); contentPane.setLayout(new GridLayout(1, 2)); mode1 = new DataModel(1); list1 = new JList(mode1); list1.setBorder(BorderFactory.createTitledBorder("国家名称!")); list1.addMouseListener(this);// 一遇到鼠标事件立即执行. mode2 = new DataModel(2); list2 = new JList(mode2); list2.setBorder(BorderFactory.createTitledBorder("你最喜欢到哪个国家玩呢!")); list2.addMouseListener(this);// 一遇到鼠标事件立即执行. contentPane.add(new JScrollPane(list1)); contentPane.add(new JScrollPane(list2)); f.pack(); f.show(); f.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); } public static void main(String[] args) { new JList8(); } // 处理鼠标键击事件. public void mouseClicked(MouseEvent e) { int index; /* * 对list1而言,当鼠标在某个项目连续按两下时,我们利用JList所提供的locationToIndex()方法,找到所键击的项目,并 * 由tmp取得此项目的项目值 * ,然后将此项目值增加到mode2中[mode2.addElement(tmp)],用setModel重新设置list2的 * ListModel,使list2可显示出所增加的项目,将刚刚在list1双击的项目删除. */ if (e.getSource() == list1) { if (e.getClickCount() == 2) { index = list1.locationToIndex(e.getPoint()); String tmp = (String) mode1.getElementAt(index); mode2.addElement(tmp); list2.setModel(mode2); mode1.removeElementAt(index); list1.setModel(mode1); } } if (e.getSource() == list2) { if (e.getClickCount() == 2) { index = list2.locationToIndex(e.getPoint()); String tmp = (String) mode2.getElementAt(index); mode1.addElement(tmp); list1.setModel(mode1); mode2.removeElementAt(index); list2.setModel(mode2); } } } class DataModel extends DefaultListModel { DataModel(int flag) { if (flag == 1) { for (int i = 0; i < s.length; i++) addElement(s[i]); } } } }