ITEEDU

swing的版面结构

版面管理器

事件处理

鼠标事件

键盘事件处理

窗口与面板的使用

JInternalFrame的使用(窗口与面板)

JTabbedPane,JScroolPane,JScrolBa的使用

标签与按钮的使用与介绍

[复选框、选项按钮、列表方框、下拉式列表的使用与介绍]

表格(Table)的使用与介绍

JTable的事件处理

1文字输入组件的使用与介绍

树(Tree)的使用与介绍

对话框(Option Pane与Dialog)的使用与介绍

菜单与工具栏的使用与介绍

文件选择对话框,颜色选择对话框,分隔线的使用与介绍.

Slider,Timer,Progress的使用

7-3-4:JList的事件处理:

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]);
			}
		}
	}
}