學Java時用到了JList不知怎么添加元素,這里說說我的經驗:
Jlist顯示對象列表並且允許用戶選擇一個或多個項的組件。單獨的模型 ListModel
維護列表的內容。
這里要注意在把Jlist添加到容器時可以選擇用JScrollPane(提供輕量級組件的 scrollable 視圖。JScrollPane
管理視口、可選的垂直和水平滾動條以及可選的行和列標題視口。)
例如:JPanel jp = new JPanel();
JScrollPane jsp = new JScrollPane();
JList jl = new JList();
jsp.add(jl);
jp.add(jsp);
這里只是個例子:為了說明JList 對象不能直接添加到JPanel中,而是要添加到JScrollPane中,之后再把JScrollPane 對象添加到JPanel中。這里沒有加有關布局管理器的代碼,讀者可以根據這個思想自行添加。(這只是我的經驗,如有更好的方法還請補充)。
再說說如何動態的添加元素到JList中:
先舉例說明靜態的添加元素:
String[] data = {"one", "two", "three", "four"};
JList myList = new JList(data);
Vector superClasses = new Vector();
Class rootClass = javax.swing.JList.class;
for(Class cls = rootClass; cls != null; cls = cls.getSuperclass()) {
superClasses.addElement(cls);
}
JList myList = new JList(superClasses);
ListModel model = myList.getModel();
for(int i = 0; i < model.getSize(); i++) {
System.out.println(model.getElementAt(i));
}
這三種都是jdk文檔里的例子,都是在創建JList的時候靜態的添加元素,添加后不能修改,刪除,增加。
如果要動態的添加,以下是我的經驗:
按我的理解,其實JList不管數據的添加,而是由DefaultListModel類實現數據的添加,先說說這個類的繼承關系。
ListMode(接口)<----AbstractListMode類<------DefaultListModel類
例如:
DefaultListModel dlm = new DefaultListModel();
dlm.addElement(element1);
dlm.addElement(element2);
.....
JList jl = new JList();
jl.setModel(dlm);
這樣就把元素都添加進去了。
同理:要刪除全部信息
dlm.clear();
jl.setModel(dlm);
即可。
移除此列表中指定位置處的元素
則:
dlm.remove(int index);
jl.setModel(dlm);
總之,就是JList不管元素的添加,而是由DefaultListMode管,最后設置Jlist.setMode(DefaultListMode)就完成了元素的動態添加。想了解更多有關Jlist的知識請查詢Jdk幫助文檔。
=====================
List:
顯示對象列表並且允許用戶選擇一個或多個項的組件。
JList的構造方法:
1.根據數組創建列表:
JList(Object[] listData)
構造一個 JList,使其顯示指定數組中的元素。
String[] str = { "列表1", "列表2", "列表3", "列表4" };
JList<String> s = new JList<>(str);
一個簡單地列表就顯示出來了。
2.根據指定的非 null 模型構造一個顯示元素的 JList。
JList(ListModel dataModel)
DefaultListModel<String> model=new DefaultListModel<>(); model.addElement("列表1"); model.addElement("列表2"); model.addElement("列表3"); model.addElement("列表4"); JList<String> s = new JList<>(model);
一個圖片的JList
ImageIcon u = new ImageIcon(this.getClass().getResource("卡通.jpg"));
u.setImage( u.getImage().getScaledInstance(50, 50, Image.SCALE_DEFAULT));
DefaultListModel<ImageIcon> model=new DefaultListModel<>();
model.addElement(u);
model.addElement(u);
model.addElement(u);
model.addElement(u);
JList<ImageIcon> list = new JList<>(model);
怎么實現一個又有圖片又有文字的JList呢?
首先認識一下,JList的幾個重要部分:
1.ListModel列表模型,用於獲取列表中每個單元格的值以及列表的長度,
我們可以通過繼承AbstractListModel類,來寫自己的JList列表;AbstractListModel類繼承了實現了ListModel接口,並且實現了序列化,
2.ListCellRenderer :單元渲染器。
要想使列表添加圖片,那么我們就需要去自己實現這個ListCellRenderer 這個接口;
在默認的單元渲染器中,返回的是一個JLable,也就是把一個JLable放入JList中的列表中,作為它的每一個項目;
從JList默認的單元渲染器中我們可以看出JAVA自帶的JList不能夠同時實現文字以及圖片。所以如果要實現一個既有文字又有圖片的JList的話,那我們就需要去自己實現單元渲染器;
自定義JLIst列表
1.自定義ListModel列表模型:
public class FriListModel extends AbstractListModel {
ArrayList<User> uArray;//好友類表;
public FriListModel(ArrayList<User> uArray){
this.uArray=uArray;
}
@Override
public int getSize() {
return uArray.size();
}
@Override
public Object getElementAt(int index) {
return uArray.get(index) ;
}
}
2.自定義單元渲染器
@SuppressWarnings({ "rawtypes", "serial" })
public class FriListCellRenderer extends JLabel implements ListCellRenderer {
@Override
public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected,
boolean cellHasFocus) {
User user=(User)value;//把數據轉換為user對象, 在AbstractListModel 中傳過來的是一個user對象;
/*******設置JLable的文字******/
String text="<html>"+user.name+"<br/>"+user.motto+" <html/>";
setText(text);//設置JLable的文字
/*******設置JLable的圖片*****/
// 得到此圖標的 Image,然后創建此圖像的縮放版本。
Image img=user.u.getImage().getScaledInstance(50, 50, Image.SCALE_DEFAULT);
setIcon(new ImageIcon(img));//設置JLable的圖片
setIconTextGap(30);//設置JLable的圖片與文字之間的距離
return this;
}
}
為了能夠圖片的同比例縮放對於圖片進行了修改,是他能夠匹配JList的大小;
圖片的縮放方法:
Image img = image.getImage(); //得到此圖標的 Image(image.getImage())
img = img.getScaledInstance(width, height, Image.SCALE_DEFAULT);
// 創建此圖像的縮放版本。
image.setImage(img);//該圖像就設置為得到的縮放版本
this.image=image;
然后為了使JList中的文字能夠換行用了HTML格式來設置JLable的text;
3.構建JList
//*創建一個Jlist,顯示好友類表**/ FriListModel buddy = new FriListModel(uArray); @SuppressWarnings("rawtypes") JList buddyList = new JList(buddy); //設置單元渲染器 buddyList.setCellRenderer(new FriListCellRenderer()); buddyList.setFont(new Font(Font.SERIF, Font.PLAIN, 18)); buddyList.setPreferredSize(new Dimension(360, 350)); /*********給好友列表添加滾動條**************/ JScrollPane jp = new JScrollPane(buddyList); jp.setPreferredSize(new Dimension(360, 400)); jpanel.add(jp);
這樣一個帶圖片的文字的JList就做好了
最后,來看一看效果: