2012-04-27 2 views
1

У меня есть панель, содержащая JList. Когда я добавляю эту панель на запад BorderLayout с одним элементом, все в порядке, и я вижу один элемент в нем, но если я добавлю новый элемент или очищу весь элемент, я не вижу эффекта.Почему JList не отображает новый добавленный элемент?

Может ли любое тело предложить любое решение?

JPanel класс, который содержит JList

public class FtpPanel extends JPanel{ 
public JList ftpJList; 
public DefaultListModel ftpListModel; 

public FtpPanel(String[] list) { 
    this.setLayout(new BorderLayout()); 
    this.setBorder(new EmptyBorder(20, 20, 20, 20)); 
    this.ftpListModel = new DefaultListModel(); 
    for(String s : list){ 
     this.ftpListModel.addElement(s); 
    } 
    this.ftpJList = new JList(ftpListModel); 
    final JScrollPane wsp = new JScrollPane(this.ftpJList); 
    wsp.setBorder(new TitledBorder(new WebBorder(),"ftpsrv.itra.de")); 
    this.add(wsp, BorderLayout.CENTER); 
} 

}

FtpTabPanel, к которому будет добавлен FtpPanel

public class FtpTabPanel extends JPanel{ 
public FtpPanel ftpPanel; 
public FtpTabPanel() { 
    createComponents(); 
    layoutComponents(); 
    initializeComponents(); 
} 

private void createComponents() { 
    ftpPanel = new FtpPanel(new String[]{"You aren't Connected"}); 
} 
private void layoutComponents() { 
    setLayout(new BorderLayout()); 
    add(ftpPanel, BorderLayout.WEST); 
} 

}

Добавить и удалить из JList

addFileToJlist(listOfFtpFile){ 
    SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       if(listOfFtpFile !=null) 
        ftpTabPanel.ftpPanel.ftpListModel.clear(); 
        ftpTabPanel.ftpPanel.updateUI(); 
        for(String s : listOfFtpFile){ 
         ftpTabPanel.ftpPanel.ftpListModel.addElement(s); 
         ftpTabPanel.ftpPanel.ftpWebList.validate(); 
         ftpTabPanel.ftpPanel.updateUI(); 
        } 
       ftpTabPanel.ftpPanel.ftpWebList.revalidate(); 
       panel.updateUI(); 
      } 
     }); 
} 

ответ

3

Вот простой рабочий пример (то есть почти такой же, как у вас, но без ненужных обновлений):

public static void main (String[] args) 
{ 
    JFrame frame = new JFrame(); 

    final DefaultListModel model = new DefaultListModel(); 

    JList list = new JList (model); 
    frame.add (new JScrollPane (list)); 

    list.addMouseListener (new MouseAdapter() 
    { 
     public void mousePressed (MouseEvent e) 
     { 
      model.clear(); 
      Random random = new Random(); 
      int max = random.nextInt (10); 
      for (int i = 0; i <= max; i++) 
      { 
       model.addElement ("" + random.nextInt (100)); 
      } 
     } 
    }); 

    frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); 
    frame.setSize (200, 400); 
    frame.setLocationRelativeTo (null); 
    frame.setVisible (true); 
} 

И я не вижу какой-либо проблемы в вашем примере (за исключением ненужных проверок и вызовов updateUI). Кажется, что проблема в другом месте ...

+0

* «Кажется, что проблема находится где-то в другом месте». OP - за лучшую помощь раньше, опубликуйте [SSCCE] (http://sscce.org/). –

-2

У меня была аналогичная проблема недавно. Решил это просто так:

(Добавить элементы в Jlist) Jlist.setVisible (false); Jlist.setVisible (true);

Только так оно и работает, не знаю почему.

+1

-1 Если это кажется решением, вы делаете что-то ужасно неправильно в другом месте (скорее всего, модель не соответствует контракту на уведомление об изменении или вы меняете базовую структуру данных под ногами) – kleopatra

Смежные вопросы