JList動態添加元素,jlist動態元素

來源:互聯網
上載者:User

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就做好了

最後,來看一看效果:

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.