2015-10-23 5 views
1

В моей программе у меня есть jList, и я могу добавлять, удалять, изменять элементы в этом Jlist. Моя проблема в том, что если я нажму кнопку «Добавить» перед тем, как выбрать элемент в jList, элементы внутри jList исчезнут. (только в области apeareance, потому что они на самом деле все еще находятся в jList)jList не отображает данные в конкретном случае

Если до этого я выбираю элемент в своем списке, тогда все работает нормально. Поэтому я предполагаю, что метод valueChanged() от моего слушателя делает то, что я сам не делаю.

Вот мой список инициализации, который я называю в начале программы:

public final void initList() { 
    jListPaiement.setModel(new MyListModel(ls.getDb().getListePaiements())); 
    final DecimalFormat df = new DecimalFormat("###.##"); 

    jListPaiement.addListSelectionListener(new ListSelectionListener() { 
     @Override 
     public void valueChanged(ListSelectionEvent lse) { 
      MoyenPaiement mp = (MoyenPaiement) ((MyListModel) jListPaiement.getModel()).getElementAt(jListPaiement.getSelectedIndex()); 
      jTextFieldFF.setText(df.format(mp.getFraisf())); 
      jTextFieldFV.setText(df.format(mp.getFraisv() * 100)); 
      jTextFieldNomP.setText(mp.getNom()); 
      jTextFieldFF.setVisible(true); 
      jTextFieldFV.setVisible(true); 
      jTextFieldNomP.setVisible(true); 
      jLabel1.setVisible(true); 
      jLabel6.setVisible(true); 
      jLabel7.setVisible(true); 
      jLabel8.setVisible(true); 
      jLabel11.setVisible(true); 
      jButtonSaveP.setVisible(true); 
     } 
    }); 

Вот код от кнопки добавления:

private void jButtonAddPActionPerformed(java.awt.event.ActionEvent evt) {   
    MoyenPaiement mp = new MoyenPaiement("Nouveau", 0, 0); 
    ((MyListModel) jListPaiement.getModel()).addElement(mp); 
    jListPaiement.setSelectedValue(mp, true); 
    jListPaiement.repaint(); 
} 

MyListModel код:

public class MyListModel extends AbstractListModel { 

    ArrayList list; 

    public MyListModel(ArrayList list) { 
     this.list = list; 
    } 

    @Override 
    public int getSize() { 
     return list.size(); 
    } 

    @Override 
    public Object getElementAt(int i) { 
     return list.get(i); 
    } 

    public void addElement(Object o){ 
     list.add(o); 
    } 

    public void deleteElement(Object o){ 
     list.remove(o); 
    } 

    public void setElement(int i,Object o){ 
     list.set(i, o); 
    } 

    public ArrayList getList() { 
     return list; 
    } 

    public void setList(ArrayList list) { 
     this.list = list; 
    } 
} 

Любая помощь будет принята с благодарностью.

Благодаря

Edit: После дальнейших исследований, проблема в том, когда я добавить элемент в моей модели.

Он приходит ровно на линии:

((MyListModel) jListPaiement.getModel()).addElement(mp); 

Даже если добавить простую строку, такие как:

((MyListModel) jListPaiement.getModel()).addElement("String"); 

проблема все еще происходит.

+0

вы можете обеспечить лучший пример кода? Я не вижу, где вы инициализируете 'jButtonSaveP' или как вы используете' jButtonAddPActionPerformed' –

+0

Реализация 'MyListModel' может представлять интерес, поскольку это может помешать вашему списку, например. не предоставлять правильные элементы при перекраске. – Thomas

+0

Я использую интерфейс дизайна netbeans, чтобы сделать мой графический интерфейс, поэтому мои кнопки инициализируются автоматически в 'initComponent()'. 'jButtonSaveP' - это кнопка, которую я использую для сохранения моего редактирования. Это не моя кнопка добавления и использование этой кнопки или нет, не имеет значения для моей проблемы. 'jButtonAddPActionPerformed' используется, когда я нажимаю на свою кнопку. Не уверен, что вы имеете в виду здесь, извините. ' jButtonAddPActionPerformed' – Jeremy

ответ

0

Подробно посмотрите, что происходит на этой линии, и если вы правильно инициализировали jListPaiement с правильными данными.

jListPaiement.setModel(new MyListModel(ls.getDb().getListePaiements())); 

Похоже на этой линии setSelectedValue() не может найти элемент mp

jListPaiement.setSelectedValue(mp, true); 
+0

jListPaiement получает правильные данные, так как при запуске программы отображается правильный элемент. Это только после того, как я нажму кнопку «Добавить», которая изменится на дисплее. Я не уверен, что вы имеете в виду, когда говорите, что 'setSelectedValue()' не может найти 'mp', так как он инициализирован раньше. 'MoyenPaiement mp = new MoyenPaiement (« Нуво », 0, 0); ((MyListModel) jListPaiement.getModel()). AddElement (mp); jListPaiement.setSelectedValue (mp, true); ' – Jeremy

+0

Если вы вызываете' setSelectedValue() 'с элементом, не входящим в список (или null), выбранный индекс должен быть установлен в -1 (т. Е. Ничего не выбрано). Список должен отображаться правильно. – Thomas

+0

Это моя точка да, я все равно попытался удалить 'setSelectedValue()', и проблема все еще там. – Jeremy

0

я, наконец, нашел решение. Вместо использования моей собственной модели списка я использовал DefaultListModel, и все работает нормально. Прошло много времени с тех пор, как я работал над этим проектом, и я не помню, почему я решил создать свой собственный класс модели списка.

Даже трудно это сейчас работает, я до сих пор не понимаю, что не хватает в моем собственном классе (MyListModel), что сделал это не работает ..

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