-1

这是我创建 Jlist 并使用动作侦听器填充它的代码

首先,我使用了一个字符串数组来填充 Jlist,并且我有滚动条。然后,为了更新 Jlist,我需要将 Jlist 的模式更改为 DefaultListModel,一旦我进行了更改,我就丢失了滚动条。

我不知道出了什么问题

任何人都可以帮助我吗

private Component makeListView() {  
        final DefaultListModel<String> listModel = new DefaultListModel<String>();
        final JList<String> list = new JList<String>(listModel);
        list.setModel(listModel);
        updateCourseListPanel(listModel);
        notifyObserverInModelForClickingOnListItem(list);       
        list.setPreferredSize(getSize());
        list.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
        list.setLayoutOrientation(JList.HORIZONTAL_WRAP);
        list.setVisibleRowCount(-1);        
        list.setFixedCellWidth(80);
        JScrollPane listScroller = new JScrollPane(list);
        listScroller.setPreferredSize(getMaximumSize());
        setVisible(true);       
        return list;
    }
4

1 回答 1

2

很难从您的代码段中分辨出来(因为您没有显示调用它的代码):从表面上看,问题是您返回列表而不是它添加到的 scrollPane。

更深层次的问题是,您似乎(只是猜测,因为缺乏细节:-) 每当需要更新数据时重新创建列表。更好的方法是将列表及其模型的创建与其更新分开,并仅根据需要更新模型:

private Component makeListView() {  
    final DefaultListModel<String> listModel = new DefaultListModel<String>();
    final JList<String> list = new JList<String>(listModel);
    list.setModel(listModel);
    list.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
    list.setLayoutOrientation(JList.HORIZONTAL_WRAP);
    list.setFixedCellWidth(80);
    JScrollPane listScroller = new JScrollPane(list);
    return listScroller;
 }

 private void update(Jlist list) {  
    updateCourseListPanel(list.getModel());
    notifyObserverInModelForClickingOnListItem(list);       
 }

顺便说一句,从不调用任何 setXXSize 方法,某些原因

于 2013-04-19T15:39:42.320 回答