代码如下:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class JListDemo02
{
public static void main(String[] args)
{
new MyList();
}
}
class MyListModel extends AbstractListModel
{
private String country[]={"中国","巴西","美国","韩国","意大利","法国"};
public Object getElementAt(int index)
{
if(index<this.country.length)
{
return this.country[index];
}else
{
return null;
}
}
public int getSize()
{
return this.country.length;
}
}
class MyList
{
private JFrame jf1=new JFrame();
private Container c1=jf1.getContentPane();
private JList jl1=null;
public MyList()
{
this.jl1=new JList(new MyListModel());
jl1.setBorder(BorderFactory.createTitledBorder("你喜欢哪个国家旅游?"));
jl1.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
c1.add(new JScrollPane(this.jl1));
c1.add(this.jl1);
jf1.setSize(320, 150);
jf1.setLocation(100,160);
jf1.setVisible(true);
this.jf1.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e)
{
System.exit(1);
}
});
}
}
问题如下:
1、第36行的this.jl1=new JList(new MyListModel());,括号里面的匿名对象怎么把MyListModel类的内容加入到JList方法中,在MyListModel类里,只有个系统默认的空的构造方法,所以我不明白怎么加入的???哪个会请具体解析下!
2、还有这个getElementAt、getSize方法在MyListModel类中起什么作用的???
------解决思路----------------------
AbstractListModel实现了ListModel接口
JList的数据是通过这个ListModel接口回调获取数据的
在就是为什么需要你实现getElementAt、getSize方法
它不管你怎么组织数据的
而只管你怎么提供数据的(通过这两个回调方法提供数据)
------解决思路----------------------
那些方法算是MyListModel类重写的成员方法,MyListModel类继承的是ListMode类。而JList的构造方法中加入ListMode类参数的构造方法,
JList(ListModel dataModel) 根据指定的非 null 模型构造一个显示元素的 JList。
------解决思路----------------------
1、第36行的this.jl1=new JList(new MyListModel());,括号里面的匿名对象怎么把MyListModel类的内容加入到JList方法中,在MyListModel类里,只有个系统默认的空的构造方法,所以我不明白怎么加入的???哪个会请具体解析下!
JList 有个构造函数 JList(ListModel dataModel) 其形参类型是ListModel,ListModel是个接口,AbstractListModel实现了这个接口
MyListModel又继承了AbstractListModel,MyListModel可以向上转型为ListMode,作为这个构造函数的形参传入,构造一个JList
MyListModel在继承AbstractListModel的时候实现了getElementAt、getSize方法,这两个方法是在ListModel中定义的,所以在调用这两个方法的时候,会动态绑定