JList動態添加元素,jlist動態元素
JList動態添加元素 http://www.cnblogs.com/tianguook/archive/2012/01/31/2333992.htmlhttps://zhuanlan.zhihu.com/p/24676104
學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;}@Overridepublic int getSize() { return uArray.size();}@Overridepublic Object getElementAt(int index) {return uArray.get(index) ;}}
2.自訂單元渲染器
@SuppressWarnings({ "rawtypes", "serial" })public class FriListCellRenderer extends JLabel implements ListCellRenderer {@Overridepublic 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就做好了
最後,來看一看效果: