JList動態添加元素


 
http://www.cnblogs.com/tianguook/archive/2012/01/31/2333992.html
https://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;		
	}
	@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就做好了

最后,來看一看效果:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM