【问题标题】:Update JComboBox popupMenu更新 JComboBox popupMenu
【发布时间】:2013-05-10 08:28:01
【问题描述】:

我有一个JComboBox,一开始只有一个值,并且有一个 MouseListener 连接到它。当我点击JComboBox 时,我用一些新值填充它。但是在第一次点击JComboBox 时,popupMenu 的大小只有一个元素。第二次所有值都将正常显示。 知道如何让组合框在更新其内容后直接更新其 popupMenu 吗?

示例程序:

public class ComboBoxUpdate extends JFrame implements MouseListener {

    private JComboBox<String> box;
    public ComboBoxUpdate(){
        // Init
        JPanel panel = new JPanel();
        box = new JComboBox<String>();
        box.addItem("from start");

        // Add listener
        Component[] comps = box.getComponents();
        for(int i = 0; i < comps.length; i++)
            comps[i].addMouseListener(this);

        panel.add(box);
        this.add(panel);
        this.pack();
        this.setVisible(true);
    }

    @Override
    public void mouseClicked(MouseEvent e) {
        if(box.getItemCount() == 1){
            box.removeAllItems();
            box.addItem("item 1");
            box.addItem("item 2");
            box.addItem("item 3");
        }
    }

    public static void main(String[] args){
        new ComboBoxUpdate();
    }

    @Override
    public void mousePressed(MouseEvent e) {}

    @Override
    public void mouseReleased(MouseEvent e) {}

    @Override
    public void mouseEntered(MouseEvent e) {}

    @Override
    public void mouseExited(MouseEvent e) {}
}

【问题讨论】:

    标签: java swing jcombobox


    【解决方案1】:

    我认为这是更好的解决方案:

    public class ComboBoxUpdate extends JFrame implements PopupMenuListener {
    
        private JComboBox box;
    
        public ComboBoxUpdate() {
            // Init
            JPanel panel = new JPanel();
            box = new JComboBox();
            box.addItem("from start");
    
            box.addPopupMenuListener(this);
    
            panel.add(box);
            this.add(panel);
            this.pack();
            this.setVisible(true);
        }
    
        @Override
        public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
            if (box.getItemCount() == 1) {
                box.removeAllItems();
                box.addItem("item 1");
                box.addItem("item 2");
                box.addItem("item 3");
            }
        }
    
        @Override
        public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {
        }
    
        @Override
        public void popupMenuCanceled(PopupMenuEvent e) {
        }
    }
    

    【讨论】:

    • 这使我的盒子只在第一次点击时闪烁并关闭。工作原理:列表从一开始就显示“选择汽车”。点击后,只会显示汽车。
    【解决方案2】:

    我有一个 JComboBox,一开始只有一个值,并且有一个 MouseListener 连接到它。当我点击 JComboBox 我填充它 有一些新的价值观

    1. Item(s) 到 JComboBox 在运行时只能添加/删除/修改到 XxxComboBoxModel

    2. 如果您要更改所有项目,请使用DefaultComboBoxModel

    3. 使用MutableComboBoxModel 在运行时添加/删除/修改项目

    【讨论】:

    • 试过了,结果还是一样:code@Override public void mousePressed(MouseEvent e) { if(box.getItemCount() == 1){ String[] newData = {"item1", “项目2”,“项目3”}; DefaultComboBoxModel 模型 = 新 DefaultComboBoxModel(newData); box.setModel(模型); } }code
    【解决方案3】:

    尝试mousePressed()mouseReleased() 事件而不是mouseClicked() 事件。此外,您必须repaint() 才能使更改可见。

           @Override
            public void mousePressed(MouseEvent e) {
                System.out.println("Pressed");
                 if(box.getItemCount() == 1){
                     box.removeAllItems();
                     box.addItem("item 1");
                     box.addItem("item 2");
                     box.addItem("item 3");
                     repaint();
                 }
            }
    

    【讨论】:

    • 移至 mousePressed 并添加 repaint() 但结果仍然相同。
    猜你喜欢
    • 2011-11-28
    • 1970-01-01
    • 2020-05-02
    • 2014-04-11
    • 1970-01-01
    • 1970-01-01
    • 2021-01-01
    • 1970-01-01
    相关资源
    最近更新 更多