Java中广泛采用一种接口式的设计,这使得Java的Swing组件的表现上十分灵活。
Jlist究竟是如何设计的呢?事实上:Jlist把图形和数据进行的分离。JList中可以T可以是字符串数组。
String[] text={
A,B,C,D};
JList<String> list=new JList<String>(text);
如想要自由地添加列表元素,可以获得一个DefaultListModel,它实现了ListModel接口
DefaultListModel<String> model=new DefaultListModel<>();
使用addElement()就可以添加元素了,并且还会通知JList重新绘制列表。
改变JList的外观需要设置单元格渲染器,单元格渲染器需要继承JComponent并实现ListCellRenderer接口
每次绘制单元格时,就会调用public Component
getListCellRendererComponent(JList<? extends Object> list, Object value,
int index,boolean isSelected, boolean cellHasFocus)方法,并返回
Component对象,并使用paintComponent()方法绘制出单元格,绘制完成后,调用
getPreferredSize()返回组件的大小。
有一种简单的方法就是在public Component
getListCellRendererComponent(JList<? extends Object> list, Object value,
int index,boolean isSelected, boolean cellHasFocus)方法中创建JLabel对象并返回,这样就不要我们用画笔(Graphics对象)绘制了。这就相当于在列表中加入了标签。
JList是不带滚动条的,也需要我们自己去定制。
不得不承认,这十分复杂,但这样的设计可以使得我们自由的设置列表的样式。甚至对每一个单元格都可以定制它的样式。这用其他的语言实现恐怕会需要更多的代码。
下面给出一个例子
package JList;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import javax.swing.DefaultListModel;
import javax.swing.JComponent