Обновление Java JList только после минимизации или максимизации - PullRequest
2 голосов
/ 11 февраля 2011

У меня есть JList, связанный с коллекцией. При смене коллекции мне нужно, чтобы JList автоматически обновлялся. Но я вижу, что мой JList обновится только после того, как я свернул (или развернул) JFrame.

Почему?

Я новичок в Java и пытаюсь учиться.

У меня есть эта коллекция для списка моделей:

public class UserCollection extends Vector<User> implements ListModel{

private static final long serialVersionUID = 2668410577023194442L;

@Override
public void addListDataListener(ListDataListener arg0) {
    System.out.println("add list! --- " +arg0.toString());
}

@Override
public Object getElementAt(int index) {
    return this.get(index).getName();
}

@Override
public int getSize() {
    return(this.elementCount);
}

@Override
public void removeListDataListener(ListDataListener arg0) {}

}

В другом классе я заполняю коллекцию userList.add(u1); или userList.remove(u1);

В классе JFrame у меня есть:

JList list = new JList();
list.setModel(xmppManager.userList);

Я вижу на консоли изменение коллекции, и если я минимизирую JFrame и / или увеличиваю, JList обновляется должным образом ...

Ответы [ 4 ]

1 голос
/ 12 февраля 2011

Если вы можете, я предлагаю вам использовать DefaultListModel в качестве модели вашего JList.Эта модель будет автоматизировать изменение представления (JList) по мере изменения модели и сделает вашу жизнь намного проще.Если вам абсолютно необходимо использовать коллекцию вашего собственного создания, то посмотрите, можете ли вы иметь класс, содержащий его, расширяющий AbstractListModel.Если вы сделаете это, обязательно вызывайте соответствующий метод fireXXXX () каждый раз, когда вы изменяете данные в модели.

1 голос
/ 11 февраля 2011

Как только ваша коллекция изменилась, вызовите обновление в вашем JList:

  SwingUtilities.invokeLater(new Runnable() {
    public void run() {
      jlist.revalidate(); // triggers a repaint of all the items in the JList.
      jlistContainer.repaint(); // Not sure if this one is needed
    }
  });

Как обновляется ваша модель JList?

[РЕДАКТИРОВАТЬ] Теперь, когда у нас есть ваш код, вы должны взглянуть на AbstractListModel и реализовать свою модель таким же образом или, что лучше, расширяет AbstractListModel.

На самом деле, вы добавляете данные в свою коллекцию, но модель не уведомляется об этом изменении!

0 голосов
/ 13 февраля 2011

Наконец-то я решил эту проблему благодаря вашей помощи!

Вот что я сделал:

1) В классе, выполняя работу, я имею

public DefaultListModel userList;

и я заполняю его userList.addElement(user) и userList.removeElement(user)

2) в классе JFrame, у меня есть:

JList list = new JList();
list.setCellRenderer(new UsersRenderer());
list.setModel(xmppManager.userList);

3), и это мой UsersRenderer:

import java.awt.Color;
import java.awt.Component;
import javax.swing.*;

public class UsersRenderer extends javax.swing.JPanel implements ListCellRenderer {

    /**
     * 
     */
    private static final long serialVersionUID = -9210143012283239644L;
    public UsersRenderer() {
        initComponents();
    }

    public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
        User person = (User) value;
        labelUser.setText(person.getName() + " " + person.getAddress());
        if (isSelected) {
              setBackground(Color.red);
              setForeground(Color.white);
            } else {
              setBackground(Color.white);
              setForeground(Color.black);
            }
        return this;
    }                     
    private void initComponents() {
        labelUser = new javax.swing.JLabel();
        labelUser.setFont(new java.awt.Font("Tahoma", 1, 11)); // NOI18N
        labelUser.setText("testo");
        add(labelUser);
    }
    private javax.swing.JLabel labelUser;  
}
0 голосов
/ 12 февраля 2011

Когда вы добавляли или удаляли элементы, используя методы добавления и удаления, вы вызывали методы в Vector.Это обновило вашу модель, но фактический JList не имел возможности узнать, что модель была обновлена ​​и что ей нужно обновить себя.

(я думаю, что другие адекватно объяснили, как решить проблему)

...