JList обернуть вопрос - PullRequest
       19

JList обернуть вопрос

3 голосов
/ 30 декабря 2011

Когда я добавляю элементы к нему во время выполнения, кажется, что он не обновляет оболочку должным образом. При повторной проверке фрейма он будет продолжать отображать новые элементы в последней строке (даже сохраняя старые перенесенные строки), но не будет продолжать и переноситься на новую строку.

Список может быть переупакован только при изменении размера кадра (не работают валидация, проверка и перерисовка).

    final JFrame frame = new JFrame();
    final Vector<String> strings = new Vector<String>();
    JList list = new JList(strings);

    list.setLayoutOrientation(JList.HORIZONTAL_WRAP);
    list.setVisibleRowCount(-1);

    strings.add(" ------------------ add ------------------");
    strings.add(" ------------------ add ------------------");

    JButton button = new JButton("add");
    button.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {
            strings.add(" ------------------ add ------------------");
            //frame.invalidate();
            //frame.validate();
            //frame.repaint();
        }
    });

    JPanel panel = new JPanel(new BorderLayout());
    panel.add(list, BorderLayout.CENTER);
    panel.add(button,BorderLayout.SOUTH);

    frame.setSize(400,400);
    frame.add(panel);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);

1 Ответ

4 голосов
/ 30 декабря 2011

Используйте ListModel, например DefaultListModel. Он будет запускать «правильные» события для JList, чтобы он обновлялся при добавлении или удалении объектов из модели.

public static void main(String[] args) {

    JFrame frame = new JFrame("Test");

    final DefaultListModel model = new DefaultListModel();

    model.addElement("---added---");
    model.addElement("---added---");

    frame.add(new JList(model), BorderLayout.CENTER);
    frame.add(new JButton(new AbstractAction("Add") {

        @Override
        public void actionPerformed(ActionEvent arg0) {
            model.addElement("---added again---");
        }
    }), BorderLayout.SOUTH);

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(200, 150);
    frame.setVisible(true);
}

Для «проблемы переноса» просто используйте конструктор JList(ListModel), он будет использовать свойство JList.VERTICAL, которое отображает список так, как вы хотите.

...