在Java Swing中,JList
和JComboBox
在数据方面同步的最佳方式是什么,即在任何给定的时间点拥有相同的项目列表?基本上,如果我将项目添加到(或从中删除项目),则另一项应自动反映更改。
我尝试过以下操作,但似乎不起作用:
JList list = new JList();
JComboBox comboBox = new JComboBox();
DefaultListModel listModel = new DefaultListModel();
// add items to listModel...
list.setModel(listModel);
comboBox.setModel(new DefaultComboBoxModel(listModel.toArray()));
答案 0 :(得分:10)
您的模型 - 列表的ListModel和组合框的ComboboxModel - 需要同步。
在一般情况下,这意味着编写一个特殊的模型实现,但在你的情况下你很幸运:DefaultComboBoxModel实际上实现了ListModel,所以你只需要为你的组件使用相同的模型对象。
JList list = new JList();
JComboBox comboBox = new JComboBox();
DefaultComboBoxModel listModel = new DefaultComboBoxModel();
// add items to listModel...
list.setModel(listModel);
comboBox.setModel(listModel);
答案 1 :(得分:5)
您可以让它们共享相同的模型,可能是DefaultComboBoxModel,因为它实现了ListModel,因此应该适用于JComboBox和JList。例如:
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
public class ShareComboModel {
private static final int TIMER_DELAY = 2000;
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createGui();
}
});
}
private static void createGui() {
String[] data = {"Fe", "Fi", "Fo", "Fum"};
final DefaultComboBoxModel model = new DefaultComboBoxModel(data);
JComboBox combobox = new JComboBox(model);
JList jlist = new JList(model);
new Timer(TIMER_DELAY, new ActionListener() {
private int count = 0;
public void actionPerformed(ActionEvent e) {
model.addElement("count: " + count);
count++;
}
}).start();
JPanel comboPanel = new JPanel();
comboPanel.add(combobox);
JPanel listPanel = new JPanel();
listPanel.add(new JScrollPane(jlist));
JPanel panel = new JPanel(new GridLayout(1, 0));
panel.add(comboPanel);
panel.add(listPanel);
panel.setPreferredSize(new Dimension(400, 200));
JFrame frame = new JFrame("App");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(panel);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}