当前位置: 代码迷 >> 综合 >> JList ,DefaultListModel的联系
  详细解决方案

JList ,DefaultListModel的联系

热度:45   发布时间:2024-03-09 17:33:50.0

一.JList

JList从含义上看是一个列表,有点和JComboBox相似。其实不然,JComboBox的内容只能用一列显示出来,而JList的内容可以多列显示。

构造方法:  String[] words= { "aaa", "bbb", "ccc", "ddd"};
                    JList wordList = new JList(words);

 JList 默认多列显示,可以使用setLayoutOrientation(参数)方法来改变,共有3个参数,默认值是JList.VERTICAL。

JList.VERTICAL  只用一列来显示,但不会自动滚动,需要添加滚动面板才能出现滚动条。setVisibleRowCount(n);方法可以设置最多显示多少行(若没有添加滚动面板,此设置无效,所有内容均会显示)。

JList.VERTICAL_WRAP 纵向排列元素 。

JList.HORIZONTAL_WRAP  横向排列元素。

事件的处理,与其他控件不同,处理的不是Action事件,而是ListSelectionEvent事件,监听器为ListSelectionListener。

在这个事件处理过程中,又将鼠标的操作分为2种状态:1.按下鼠标不松手,在各个元素间拖动;2.松开鼠标。也就是说,当你按下鼠标后,会触发一个事件,拖动到另一个控件,又触发一个事件,继续拖动则继续触发事件,最后松手,触发一个事件。java 中ListSelectionEvent提供了一个方法getValueIsAdjusting(),如果该方法返回true,则代表情况1;反之代表情况2。同时请注意,JList控件不提供鼠标双击元素的处理事件。

JList 可以添加临时元素。JList 的插入与删除做不到及时更新。这个需要引用 DefaultListModel。

 最后就是内部元素的绘制了。在JList中,内部显示的每一个元素叫做一个Cell。如果我想让内部元素的显示方式更完美一些,比如居中显示,比如每一个Cell字体颜色不一样,那么我们就要借助JList的setCellRenderer方法来实现。该方法接受一个实现了ListCellRenderer接口的参数,而该接口只有一个方法getListCellRendererComponent,但是,该方法的实现是比较简单的,他只需要构造一个Component对象并返回这个对象,这个对象就是一个Cell。因此,真正的难点在于,如何修改这个Component的内部显示方式,从而使得他可以满足一个Cell的显示方式。一般来讲,我们都是用一个JPanel作为绘制Cell的对象,因为在JPanel上显示文字和图像都是很方便的。最后说一个小技巧,我们实现一个类,从JPanel继承而来,同时又实现了ListCellRenderer接口,那么我们只用实现这一个类就可以了,到时候把自己返回。

二.DefaultListModel 

DefaultTableMode 类 继 承 AbstractTableModel 抽象类而来,且实现了 getColumnCount() 、getRowCount()与 getValueAt()等 3 个方法。因此在实际的使用上, DefaultTableModel 比 AbstractTableModel要来得简单许多。在 DefaultTableMode 中,常常使用 Vector(向量)来填充表格中的数据。  这个时候添加到list或者Table 中,可以随时进行删除和修改。我们可以把它想成一个像Vector 那样的容器。

构造方法:   DefaultTableModel mm = new DefaultTableModel();  往mm 中添加元素。然后再用table 或者list 来显示。

三。代码

public class WordList extends JScrollPane  implements
        UiDataUiNotifyMessageListener{

    private static final long serialVersionUID = 200903311810L;

    private MutableList list = null; //MutableList 是我继承List的一个类,主要实现List之间的切换

    public WordList() {
        this.list = new MutableList();
        list.setCellRenderer(new WordListCellRenderer());  // 这个是List 在界面中怎么显示
        this.setViewportView(list);
        list.getSelectionModel().setSelectionMode(
                ListSelectionModel.SINGLE_SELECTION);
        list.setDragEnabled(true);                                      // 可以拖动
        list.addMouseListener(new MouseAdapter() {
            public void mouseEntered(MouseEvent e) {
                list.requestFocus();
            }
        });
    }

    public void notifyMessage(UiDataUiNotifyMessage message) {     

            *****************  给了一个监听事件,如果触发了,才往里面添加东西 ******

           DefaultListModel model = new DefaultListModel();
            for (WordObject WordObj : WordList ) {
                model.addElement(WordObject);
            }
            list.setModel(model);
        }
            break;
        default:
            break;
        }
    }
    protected class StampListCellRenderer extends DefaultListCellRenderer {    // list 的绘制
        private static final long serialVersionUID = 200903311514L;

        public StampListCellRenderer() {
            super();
        }

        public Component getListCellRendererComponent(JList list, Object value,
                int index, boolean isSelected, boolean cellHasFocus) {
            super.getListCellRendererComponent(list, value, index, isSelected,
                    cellHasFocus);
            if (value instanceof StampObject) {
                String name = ((WordObject) value).getWordName();
                ImageIcon icon = ((WordObject) value).getWordImage();
                Image img = icon.getImage();
                img = ImageUtil.createScaleImage(img, 100, 100);
                ImageIcon icon_scale = new ImageIcon(img);
                setIcon(icon_scale);
                setText(name);
                setToolTipText(name);
            }
            return this;
        }
    }
}