zeyuphoenix

          愿我愛的人快樂,愿愛我的人快樂,為了這些,我愿意不快樂.

          JList列表框

          JListJCombobox組件從本質上說是類似的,它們都是提供了一系列列表數據供用戶選擇,從表現形式上可以把JCombobox看做一個JList和一個JTextField組成,通過callback機制回調選擇項目.JList并沒有復雜的UI,當然也就沒有復雜的畫面了,所以對于提高JList的畫面表現,一般繼承ListCellRenderer加入自己的表現樣式就可以了,當然依照SwingMVC原則,需要修改數據時,實現ListModel接口就可以了,對選擇樣式修改,實現ListSelectionModel接口就可以了,它們的實現都相對簡單,功能也相對簡單,一般都不需要實現,對于復雜畫面樣式也不推薦JList,單列的JTable和自己實現的JTree比它好很多.

          JList的基本使用很簡單,先看Sun官方的使用例子:

          界面如下:

          只需要新創建一個DefaultListModel,賦予需要顯示的值就可以了.

              DefaultListModel listModel = new DefaultListModel();

              listModel.addElement("Debbie Scott");

              listModel.addElement("Scott Hommel");

              listModel.addElement("Sharon Zakhour");

          然后創建JList

          JList list = new JList(listModel);

          list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);

          當然可以給它加監聽:

          list.addListSelectionListener(this);

          也可以加鼠標的Click監聽,這是所有JComponent都具有的能力.

          然后實現監聽就可以了:

              // This method is required by ListSelectionListener.

              publicvoid valueChanged(ListSelectionEvent e) {

                 if (e.getValueIsAdjusting() == false) {

          最后把創建JList放入畫面上,就完成了.

          Sun官方還給了一個使用JList的例子,在同一行顯示多個項目:

          界面如下:

          創建JList的過程和前一個例子相同,只是需要繼承JList把它的getScrollableUnitIncrement方法重寫,變成我們自己的表現樣式:

             /**

               * Returns the distance to scroll to expose the next or previous

               * row (for vertical scrolling) or column (for horizontal scrolling).

               */

              @Override

          publicint getScrollableUnitIncrement(Rectangle visibleRect, int orientation, int direction) {

          這個方法就是描繪JList前一個后一個行或者列的表現的,只需要根據容器的大小算出現在每個格子的大小:

           Rectangle r = getCellBounds(row, row);

          然后依次放置就可以了,布局使用FlowLayout.

                Point loc = r.getLocation();

                loc.y--;

                int prevIndex = locationToIndex(loc);

                Rectangle prevR = getCellBounds(prevIndex, prevIndex);

                if (prevR == null || prevR.y >= r.y) {

                      return 0;

                }

                return prevR.height;

          當然也可以重寫其它的類實現其它樣式,復雜樣式也可以重寫JListListUI.

          其它的JList的設置顏色,字體,背景等都很簡單,按照API就可以了,至于拖拽操作也和其它組件一樣.

          最后我們實現一個自己的JList,在它的單元格內加入圖片,復選框,設置它是否可以選擇,圖片是否可以顯示,當然你也可以加入其它的表現形式,只需要再寫入新的接口.

          界面如下:




          當單元格是選中狀態時,點擊Print按鈕輸入選中的項目:

          工程目錄如下:

          先看幾個接口,

          /**

           * the interface that the JComboBox can Icon enable.

          */

          publicinterface IconEnable {

          /**

           * the interface that the list can have icon.

          */

          publicinterface IconItem {

          /**

           * the interface that the JComboBox can select enable.

          */

          publicinterface SelectEnable {

          /**

           * the interface that the list can have select.

          */

          publicinterface SelectItem {

          它們都提供

              /**

               * set bean.

               */

              publicvoid setXXX(XXX XXX);

              /**

               * get bean.

               */

              public XXX getXXX();

          來表示JList某項自定義屬性.

          然后自定義一個類實現這些接口:

          /**

           * list item.

          */

          publicclass MyListItem implements IconItem, IconEnable, SelectEnable,

                 SelectItem {

          它的屬性:

              /**

               * list value.

               */

              private Object listItem = null;

              /**

               * list is select.

               */

              privatebooleanisSelected = false;

              /**

               * list icon.

               */

              private Icon icon = null;

              /**

               * list icon enable.

               */

              privatebooleanisIconEnable = true;

              /**

               * list is select enable.

               */

              privatebooleanisSelectEnable = true;

          這樣就使這個類可以保存JList的單元格的項,我們的JListModel使用這個類的實例作為Bean來存儲JList的信息.

          接著是一個JList項目的顯示描繪類,

          /**

           * the list cell's label.

          */

          publicclass MyListLabel extends JLabel {

          它復寫JLabel

              @Override

              publicvoid setBackground(Color color) {

              @Override

              publicvoid paint(Graphics g) {

              @Override

              public Dimension getPreferredSize() {

          調整JList的單元格的顏色,圖片樣式,字體,焦點偏移和最適合大小.

          g.setColor(UIManager.getColor("Tree.textBackground"));

          g.drawRect(imageOffset, 0, d.width - 1 - imageOffset,

                                   d.height - 1);

          最后就是重要的畫面表現類MyListRenderer,它需要實現ListCellRenderer接口

          /**

           * JList cell renderer.

          */

          publicclass MyListRenderer extends JPanel implements MouseListener,

                 ListCellRenderer {

          通過繼承JPanel,使JList的單元格可以實現任何的控件效果,這里是放置一個JCheckBox和我們自定義的MyListLabel:

              /**

               * JList cell renderer.

               */

              public MyListRenderer(JList list) {

                 this.list = list;

                 setLayout(null);

                 add(checkBox = new JCheckBox());

                 add(label = new MyListLabel());

              checkBox.setBackground(UIManager.getColor("Tree.textBackground"));

              label.setForeground(UIManager.getColor("Tree.textForeground"));

                 commonIcon = UIManager.getIcon("Tree.leafIcon");

              }

          實現接口的getListCellRendererComponent方法,返回我們需要的呈現:

              /**

               * Return a component that has been configured to display the specified

               * value.

               */

              @Override

              public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {

          其中value就是我們的自定義單元格MyListItem,可以設置屬性:

          設置可用: setEnabled(((SelectEnable) value).isSelectEnabled());

          設置選擇: checkBox.setSelected(((SelectItem) value).getSelect());

          設置Label的選擇: label.setSelected(isSelected);

          設置字體和圖片:

          label.setFont(list.getFont());

                 label.setText(value.toString());

                 label.setFocus(cellHasFocus);

                 if (((IconEnable) value).isIconEnabled()) {

                     Icon icon = ((IconItem) value).getIcon();

                     if (icon == null) {

                        icon = commonIcon;

                     }

                     label.setIcon(icon);

                 }

          同樣也通過重寫getPreferredSizesetBackgrounddoLayout設置合適大小、顏色和布局:

          Dimension d_check = checkBox.getPreferredSize();

                 Dimension d_label = label.getPreferredSize();

                 returnnew Dimension(d_check.width + d_label.width,

                        (d_check.height < d_label.height ? d_label.height

                               : d_check.height));

          通過兩個組件的合適大小可以得出兩個組件的位置:

          y_check = (d_label.height - d_check.height) / 2;

          然后通過設定位置,做出Layout:

          label.setLocation(d_check.width, y_label);

          label.setBounds(d_check.width, y_label, d_label.width, d_label.height);

          最后處理的是JList的鼠標選擇JCheckBox事件,

              @Override

              publicvoid mouseClicked(MouseEvent e) {

          通過選擇定位選擇的Item,然后對應設置選中狀態,刷新:

              int index = list.locationToIndex(e.getPoint());

              MyListItem item = (MyListItem) list.getModel().getElementAt(index);

              if (((SelectEnable) item).isSelectEnabled()) {

                 item.setSelect(!((SelectItem) item).getSelect());

                 Rectangle rect = list.getCellBounds(index, index);

                 ist.repaint(rect);

              }

          這個我們的JList就設置完了,它的使用和普通的一樣,只不過Model使用的是MyListItem數組:

              MyListItem[] items = { new MyListItem("Astart"),

                     new MyListItem("B-BIX", true, icon),

                     new MyListItem("have fun game!", false, null, false, false),

                     new MyListItem("郁悶", false),

                     new MyListItem("abc", true),

                     new MyListItem("12867831", false, icon),

                     new MyListItem("happy", false, null, false, true),

                     new MyListItem("defINE", false, null) };

          JList jList = new JList(items);

          設置Renderer:

          jList.setCellRenderer(new MyListRenderer(jList));

          然后得到的JList就和普通JComponent一樣使用了.

          posted on 2010-05-03 22:46 zeyuphoenix 閱讀(36270) 評論(0)  編輯  收藏 所屬分類: Java基本組件的使用

          導航

          <2010年5月>
          2526272829301
          2345678
          9101112131415
          16171819202122
          23242526272829
          303112345

          統計

          常用鏈接

          留言簿(52)

          隨筆分類

          隨筆檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 美姑县| 潮安县| 海淀区| 望江县| 濮阳县| 青海省| 措美县| 武穴市| 顺昌县| 廉江市| 保定市| 平乐县| 德清县| 调兵山市| 定边县| 松原市| 连州市| 海南省| 青神县| 刚察县| 广南县| 平昌县| 钟山县| 泰顺县| 津南区| 康乐县| 云安县| 汝阳县| 巢湖市| 开鲁县| 井陉县| 炉霍县| 根河市| 江永县| 民丰县| 梨树县| 仁怀市| 石家庄市| 茌平县| 斗六市| 信阳市|