【问题标题】:Dynamically adding items to a JComboBox将项目动态添加到 JComboBox
【发布时间】:2011-11-15 06:47:13
【问题描述】:
Vector comboBoxItems = new Vector();
DefaultComboBoxModel model;
// ComboBox Items have gotten from Data Base initially.
model = new DefaultComboBoxModel(ComboBoxItems);
JComboBox box = new JComboBox(model);

我将此组合框添加到面板中。如果我直接在数据库中添加一些项目,我希望那些新添加的项目显示在组合框中。

我在调试时可以看到comboBoxItems 中的值,但这些值没有出现在我的组合框中。

如何在不关闭面板的情况下将这些新添加的值放入组合框中?

【问题讨论】:

  • 问题,可以使用 JComboBox 并且同时添加新项目
  • 您必须将项目添加到模型中,而不是添加到基础向量中 - 只有这样才能触发所需的通知!

标签: java swing jcombobox


【解决方案1】:

使用 ComboBoxModel 怎么样?像这样的......

    JFrame frame = new JFrame("Combo Box Demo");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(200, 200);
    frame.setLayout(new FlowLayout());

    Vector comboBoxItems=new Vector();
    comboBoxItems.add("A");
    comboBoxItems.add("B");
    comboBoxItems.add("C");
    comboBoxItems.add("D");
    comboBoxItems.add("E");
    final DefaultComboBoxModel model = new DefaultComboBoxModel(comboBoxItems);
    JComboBox comboBox = new JComboBox(model);
    frame.add(comboBox);

    JButton button = new JButton("Add new element in combo box");
    frame.add(button);
    button.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent ae) {
            model.addElement("F");
        }
    });

    frame.setVisible(true);

【讨论】:

    【解决方案2】:

    例如:

    import java.awt.*;
    import java.awt.event.*;
    import java.util.*;
    import javax.swing.*;
    
    public class ComboBoxSorted extends JFrame {
    
        private static final long serialVersionUID = 1L;
        private JComboBox comboBox;
        private JTextField textField;
    
        public ComboBoxSorted() {
            textField = new JTextField(15);
            textField.addActionListener(new ActionListener() {
    
                @Override
                public void actionPerformed(ActionEvent e) {
                    comboBox.addItem(textField.getText());
                    textField.setText("");
                    comboBox.showPopup();
                }
            });
    
            String[] items = {"one", "two", "three", "four", "five"};
            SortedComboBoxModel model = new SortedComboBoxModel(items);
            comboBox = new JComboBox(model);
            comboBox.setPrototypeDisplayValue("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX");
            JFrame frame = new JFrame("Add Item on Runtime");
            frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
            frame.add(comboBox, BorderLayout.SOUTH);
            frame.add(textField, BorderLayout.WEST);
            frame.add(new JLabel("Enter to add Item  "), BorderLayout.EAST);
            frame.pack();
            frame.setLocation(150, 150);
            frame.setVisible(true);
        }
    
        private class SortedComboBoxModel extends DefaultComboBoxModel {
    
            private static final long serialVersionUID = 1L;
    
            public SortedComboBoxModel() {
                super();
            }
    
            public SortedComboBoxModel(Object[] items) {
                Arrays.sort(items);
                int size = items.length;
                for (int i = 0; i < size; i++) {
                    super.addElement(items[i]);
                }
                setSelectedItem(items[0]);
            }
    
            public SortedComboBoxModel(Vector items) {
                Collections.sort(items);
                int size = items.size();
                for (int i = 0; i < size; i++) {
                    super.addElement(items.elementAt(i));
                }
                setSelectedItem(items.elementAt(0));
            }
    
            @Override
            public void addElement(Object element) {
                insertElementAt(element, 0);
            }
    
            @Override
            public void insertElementAt(Object element, int index) {
                int size = getSize();
                //  Determine where to insert element to keep model in sorted order            
                for (index = 0; index < size; index++) {
                    Comparable c = (Comparable) getElementAt(index);
                    if (c.compareTo(element) > 0) {
                        break;
                    }
                }
                super.insertElementAt(element, index);
            }
        }
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
    
                @Override
                public void run() {
                    ComboBoxSorted comboBoxSorted = new ComboBoxSorted();
                }
            });
        }
    }
    

    【讨论】:

      【解决方案3】:

      动态添加 JComboBox、JTextField 和 ImageIcon 等项目

      Please,Show this image on display, how many items added or Table Fields size

      After second images are display on Items like JComboBox,JTextField and ImageIcon

      for example : count=3
      //Dynamically Adding Items or Component above method
      public void  dya_addcomp(int count)
      {
      //Dynamicly Drop/Delete icon
       BufferedImage Drop_Tablefield = null;
       try {
           Drop_Tablefield = ImageIO.read(this.getClass().getResource("/images/drop.png"));
       } catch (IOException ex) {
           msg(" Error: drop and edit icon on Table, "+ex);
       }
       //count Items for loop executed..
       for(int i=0;i<count;i++)
       {
           //cnt++;
           //lblcount.setText("Count : "+cnt);
           JTextField txtcolnm=new JTextField("",20);
           JComboBox cmbtype=new JComboBox();
           JTextField txtcolsize=new JTextField("",20);
      
           JButton Drop_Table_Field = new JButton(new ImageIcon(Drop_Tablefield));
      
           cmbtype.addItem("INTEGER"); cmbtype.addItem("FLOAT");
           cmbtype.addItem("STRING");  cmbtype.addItem("BOOLEAN");
      
           colnamepanel.add(txtcolnm);   colnamepanel.add(cmbtype);
           colnamepanel.add(txtcolsize); colnamepanel.add(Drop_Table_Field);
      
           colnamepanel.setAutoscrolls(true);
      
           //refresh panel
           colnamepanel.revalidate();
           colnamepanel.repaint();
      
           //set the layout on Jpanel
           colnamepanel.setLayout(new FlowLayout(FlowLayout.LEFT,5,0));
      
       }
      

      【讨论】:

        【解决方案4】:

        我从来没有找到一个整洁的方法来做到这一点,但你可以调用removeAllItems(),然后循环调用box.addItem(items[i]),它工作正常。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-08-06
          • 2015-12-29
          • 2015-10-22
          • 1970-01-01
          • 2021-10-31
          相关资源
          最近更新 更多