同步JList和JComboBox?

Vic*_*ani 8 java swing jlist jcombobox

在Java Swing中,a JList和a 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()));
Run Code Online (Sandbox Code Playgroud)

Paŭ*_*ann 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);
Run Code Online (Sandbox Code Playgroud)


Hov*_*els 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);
      }
 }
Run Code Online (Sandbox Code Playgroud)