Как обновить JList в нескольких окнах?

Я пытаюсь обновить JList на нескольких окнах. Как я могу это сделать?

Вот мой код, пожалуйста, помогите мне.

samplListModel = new DefaultListModel<String>();
sampleList = new JList<String>(samplListModel);
samplListModel.addElement("Cities");
cityField = new JTextField();
cityField.setColumns(10);
cityButton = new JButton("Update");
JPanel panel = new JPanel();
panel.add(sampleList);
panel.add(cityField);
panel.add(cityButton);
this.add(panel);
this.setSize(500, 400);
this.setVisible(true);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
cityButton.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent ae) {
            samplListModel.addElement(cityField.getText());
            cityField.setText("");
        }
    });

2 ответа

Просто используйте то же самое DefaultListModel для обоих JList (имеется в виду два) для каждого окна. В приведенном ниже примере я использую JDialog что вы можете что-то набрать, нажмите Enter, и вы увидите, что оба списка обновлены. Не так много для этого.

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;

public class MultipleListDemo {

    private DefaultListModel model;
    private ListDialog dialog;

    public MultipleListDemo() {
        model = new DefaultListModel();
        JFrame frame = new JFrame();
        dialog = new ListDialog(frame, true);
        JList list = new JList(model);
        JScrollPane scroll = new JScrollPane(list);
        scroll.setPreferredSize(new Dimension(200, 300));

        JButton button = new JButton("Show Dialog");
        button.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e) {
                dialog.setVisible(true);
            }
        });


        frame.add(scroll);
        frame.add(button, BorderLayout.SOUTH);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public class ListDialog extends JDialog {

        public ListDialog(Frame frame, boolean modal) {
            super(frame, modal);

            JList list = new JList(model);
            JScrollPane scroll = new JScrollPane(list);
            scroll.setPreferredSize(new Dimension(200, 300));

            final JTextField field = new JTextField(15);
            field.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    model.addElement(field.getText());
                    field.setText("");
                }
            });

            setLayout(new BorderLayout());
            add(scroll);
            add(field, BorderLayout.NORTH);
            pack();
            setLocationRelativeTo(frame);
        }
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new MultipleListDemo();
            }
        });
    }
}

Вы должны использовать то же самое ListModel для обоих JListчтобы синхронизировать списки. Например, вы можете создать класс, который расширяет DefaultListModel<String> и реализовать его как синглтон. Например:

class MyListModel extends DefaultListModel<String> {

    /**
     * The one and only instance of the class.
     */
    private static final MyListModel INSTANCE = new MyListModel();

    /**
     * We don't want any other instantiations. Hence make the constructor private.
     */
    private MyListModel() { }

    /**
     * Getter for the instance of this class.
     * 
     * @return the instance of this class
     */
    public static MyListModel getInstance() {
        return INSTANCE;
    }

}

Тогда вы бы создали JList с синглтоном:

sampleList = new JList<String>(MyListModel.getInstance());

Для всех других операций на ListModel ты должен использовать MyListModel.getInstance(), тоже.

Другие вопросы по тегам