Как обновить 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()
, тоже.