2012-04-23 3 views
2

Почему myList пуст?Netbeans, empty DefaultListModel

Из вывода я вижу, что myList не имеет нужного размера, но сообщения есть.

выход:

Apr 23, 2012 4:28:42 PM net.bounceme.dur.nntp.MessagesJFrame <init> 
INFO: messages 11 
Apr 23, 2012 4:28:42 PM net.bounceme.dur.nntp.MessagesJFrame <init> 
INFO: myList 0 

MessagesJFrame:

package net.bounceme.dur.nntp; 

import java.util.List; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import javax.mail.Message; 
import javax.swing.DefaultListModel; 

public class MessagesJFrame extends javax.swing.JFrame { 

    private static final long serialVersionUID = 1L; 
    private static final Logger LOG = Logger.getLogger(MessagesJFrame.class.getName()); 
    DefaultListModel<Message> myList = new DefaultListModel<Message>(); 

    public MessagesJFrame() { 
     initComponents(); 
     EnumNNTP nntp = EnumNNTP.INSTANCE; 
     List messages = null; 
     try { 
      messages = nntp.getMessages(false); 
     } catch (Exception ex) { 
      LOG.severe("didn't get messages"); 
     } 
     myList.copyInto(messages.toArray()); 
     LOG.log(Level.INFO, "messages {0}", messages.size()); 
     LOG.log(Level.INFO, "myList {0}", myList.size()); 
    } 

    /** 
    * This method is called from within the constructor to initialize the form. 
    * WARNING: Do NOT modify this code. The content of this method is always 
    * regenerated by the Form Editor. 
    */ 
    @SuppressWarnings("unchecked") 
    // <editor-fold defaultstate="collapsed" desc="Generated Code"> 
    private void initComponents() { 

     jScrollPane2 = new javax.swing.JScrollPane(); 
     jList1 = new javax.swing.JList(); 

     setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); 

     jList1.setModel(myList); 
     jScrollPane2.setViewportView(jList1); 

     javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); 
     getContentPane().setLayout(layout); 
     layout.setHorizontalGroup(
      layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() 
       .addContainerGap(13, Short.MAX_VALUE) 
       .addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) 
       .addGap(129, 129, 129)) 
     ); 
     layout.setVerticalGroup(
      layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGroup(layout.createSequentialGroup() 
       .addContainerGap() 
       .addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) 
       .addContainerGap(158, Short.MAX_VALUE)) 
     ); 

     pack(); 
    }// </editor-fold> 

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String args[]) { 
     /* 
     * Set the Nimbus look and feel 
     */ 
     //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) "> 
     /* 
     * If Nimbus (introduced in Java SE 6) is not available, stay with the 
     * default look and feel. For details see 
     * http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
     */ 

     try { 
      for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) { 
       if ("Nimbus".equals(info.getName())) { 
        javax.swing.UIManager.setLookAndFeel(info.getClassName()); 
        break; 
       } 
      } 
     } catch (ClassNotFoundException ex) { 
      java.util.logging.Logger.getLogger(MessagesJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } catch (InstantiationException ex) { 
      java.util.logging.Logger.getLogger(MessagesJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } catch (IllegalAccessException ex) { 
      java.util.logging.Logger.getLogger(MessagesJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } catch (javax.swing.UnsupportedLookAndFeelException ex) { 
      java.util.logging.Logger.getLogger(MessagesJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } 
     //</editor-fold> 

     /* 
     * Create and display the form 
     */ 
     java.awt.EventQueue.invokeLater(new Runnable() { 

      public void run() { 
       new MessagesJFrame().setVisible(true); 
      } 
     }); 
    } 
    // Variables declaration - do not modify 
    private javax.swing.JList jList1; 
    private javax.swing.JScrollPane jScrollPane2; 
    // End of variables declaration 
} 
+0

Чтобы лучше помочь, опубликуйте [SSCCE] (http://sscce.org/). –

+0

ах, разработчики графического интерфейса Netbeans несколько несовместимы с SSCCE :( – Thufir

+0

Нет, они не являются. Это просто вопрос, как вы понимаете, как заставить их повиноваться вам, а не позволять «хвосту валять собаку», похоже, на данный момент. Все, что потребуется, - это определить «Код» в коде. –

ответ

3

Где вы добавляете модель в JList? Чтобы JList мог использовать и отображать данные, хранящиеся в модели, модель должна быть добавлена ​​в JList либо с помощью конструктора JList, либо из его метода setModel(...). Вы прошли через JList tutorials? Если нет, это первое место, которое вы должны посмотреть, поскольку оно объяснит, как использовать JLists, а затем некоторые.

Edit 1
copyInto(...) метод DefaultListModel делает противоположное тому, что вы думаете, что он делает. Он копирует данные из модели в массив.

согласно API:

Копии компонентов этого списка в указанный массив

+0

Это не столько «setModel (...)», сколько правильное заполнение DefaultListModel, которое показывалось как пустое. – Thufir

+0

@Thufir: Пожалуйста, см. Править, чтобы ответить –

+0

ohhhhh, спасибо, извините за это, добрый глупый вопрос. Вам просто нужно перебирать коллекцию и вызывать 'addItem' для каждого объекта, чтобы добавить в DefaultListModel? Нет« массового добавления »? – Thufir

0

В самом узком смысле, следующий код заполнит модель:

фиксированный метод:

public MessagesJFrame() { 
    initComponents(); 
    EnumNNTP nntp = EnumNNTP.INSTANCE; 
    List<Message> messages = null; 
    try { 
     messages = nntp.getMessages(false); 
    } catch (Exception ex) { 
     LOG.severe("didn't get messages"); 
    } 
    for (Message m : messages) { 
     myList.addElement(m); 
    } 
    LOG.log(Level.INFO, "messages {0}", messages.size()); 
    LOG.log(Level.INFO, "myList {0}", myList.size()); 
} 

Однако, что не так с myList.copyInto(messages.toArray());?

Вышеупомянутый код выводит сообщения и myList одинакового размера.

+0

Я не вижу объяснения вашей ошибки здесь. –

+0

'INFO: myList 0', который отображался как пустой при использовании' copyInto', но непусто, используя вышеприведенный код. – Thufir

+0

см. В разделе edit to my answer –

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