close


ListModel是一个interface,主要的功能是定义一些方法,让JList或JComboBox这些组件取得每个项目的值,并可限定项目的显示
时机与方式,下面为ListModel这个interface所定义的方法:


ListModel interface定义的方法:



void addListDataListener(ListDataListener l):当data model的长度或内容值有任何改变时,利用此
方法就可以处理ListDataListener的事件。data model是vector或array的数据类型,里面存放List
中的值。
Object getElementAt(int index):返回在index位置的Item值。
int getSize():返回List的长度。
void removeListDataListener(ListDataListener l):删除ListDataListener.

还记得我们一开始在介绍JList时所提到的构造函数吗?其中有一个JList的构造函数是这样的:


JList(ListModel dataModel)



因此我们必须实作ListModel所有的方法,才能利用上面这个构造函数建立JList.不过要实现ListModel所有的方法有点麻烦,因
为一般我们不会用到addListDataListener()与removeListDataListener()这两个方法。因此java提供了AbstractListModel这个抽
象类,此抽象类实作了addListDataListener()与removeListDataListener()这两个方法。若我们继承AbstractListModel,就不需
实现这两个方法,只需要实作getElementAt()与getSize()方法即可,我们来看下面的范例:



import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class JList3 {
public JList3() {
JFrame f = new JFrame("JList");
Container contentPane = f.getContentPane();

ListModel mode = new DataModel();
JList list = new JList(mode);// 利用ListModel建立一个JList.
list.setVisibleRowCount(5);// 设置程序一打开时所能看到的数据项个数。
list.setBorder(BorderFactory.createTitledBorder("你最喜欢到哪个国家玩呢?"));

contentPane.add(new JScrollPane(list));
f.pack();

f.show();
f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}

public static void main(String[] args) {
new JList3();
}
}


class DataModel extends AbstractListModel {
String[] s = { "美国", "越南", "大陆", "英国", "法国", "大陆", "意大利", "澳洲" };

public Object getElementAt(int index) {// getxElementAt()方法中的参数index,系统会自动由0开始计算,不过要自己作累加
// 的操作.
return (index + 1) + "." + s[index++];
}

public int getSize() {
return s.length;
}
}


事实上,java本身还提供另一个类,DefaultListModel实体类。此类继承了AbstractListModel抽象类,并实现里面所有的抽象方
法,因此你不需要再自行实作任何的方法,可以说是相当的方便。不过既然所有的抽象都已经被实现,因此在设计的弹性上就会有
有所降低。若你是喜欢自行管理JList项目的设计者,你可以不要使用DefaultListModel这个类,只需要在AbstractListModel上多
下功夫即可。


下面的例子我们改写上面的例子,直接使用DefaultListModel类:



import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.Vector;

public class JList4 {
public JList4() {
JFrame f = new JFrame("JList");
Container contentPane = f.getContentPane();

ListModel mode = new DataModel();
JList list = new JList(mode);
list.setVisibleRowCount(5);
list.setBorder(BorderFactory.createTitledBorder("您最喜欢到哪个国家玩呢?"));

contentPane.add(new JScrollPane(list));
f.pack();
f.show();
f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}

public static void main(String args[]) {
new JList4();
}
}


class DataModel extends DefaultListModel {
String[] s = { "美国", " 日本", "大陆", "英国", "法国", "意大利", "澳洲", "韩国" };

DataModel() {
for (int i = 0; i < s.length; i++)
addElement((i + 1) + "." + s[i]);
}
}

程序运行结果与上个范例相同。


好奇怪,这不是跟我们使用Vector方式,利用JList(Vector
v)构造函数来建立新的JList一样吗?如同JList1.java中的例子,为
什么还要多此一举呢?其实若读者去查看DefaultListModel类,可发现此类提供不少好用的方法,例如你可以随意的增加一个项目(
addElement())、或是删除一个项目(removeElement)、甚至你可以很方便地做到查询(getElementAt())与汇出(copyInto())项目的
操作。你可以发现,利用DefaultListModel可以直接动态地更改JList的项目值,而不需要自行产生一个Vecotr对象;相对于JList(
Vector v)这个构造函数,可说更方便且实用许多.



至于利用ListModel或AbstractListModel来构造JList有什么好处?读者只要这么想,ListModel中文就是“列出模式”,那么每
个老师都会有自己开课的学生成绩,老师应该可以看到每个同学的成绩,而深长应该只能看到自己的成绩,所以我们就会有两种不
同的“列出模式”。我们只需要去改写getElementAt()方法,就会有不同的列出模式产生,如下面的范例:



import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.Vector;

public class JList5 {
public JList5() {
JFrame f = new JFrame("JList");
Container contentPane = f.getContentPane();
contentPane.setLayout(new GridLayout(1, 2));
ListModel mode = new DataModel(1);
JList list1 = new JList(mode);
list1.setVisibleRowCount(5);
list1.setBorder(BorderFactory.createTitledBorder("您玩过哪些软件?"));

mode = new DataModel(2);
JList list2 = new JList(mode);
list2.setBorder(BorderFactory.createTitledBorder("您玩过哪些数据库软件?"));

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 JList5();
}
}

class DataModel extends AbstractListModel {
String[] s = { "MS SQL", "MySQL", "IBM DB2", "ORACLE", "Windows 2000",
"Linux", "UNix", "OS2" };
int flag;

DataModel(int flag) {
this.flag = flag;
}

public Object getElementAt(int index) {
String tmp = null;

if (flag == 1)
tmp = (index + 1) + "." + s[index++];
if (flag == 2) {
if (index < 4)
tmp = (index + 1) + "." + s[index++];
}

return tmp;
}

public int getSize() {
return s.length;
}
}


 


http://www.iteedu.com/plang/java/jtswingchxshj/27.php

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 lsx121924 的頭像
    lsx121924

    lsx121924的部落格

    lsx121924 發表在 痞客邦 留言(0) 人氣()