0

我一JComboBox开始只有一个值,并且有一个 MouseListener 连接到它。当我单击时,JComboBox我用一些新值填充它。但是 popupMenu 在第一次单击时具有一个元素的大小JComboBox。第二次所有值都将正常显示。知道如何让组合框在更新其内容后直接更新其 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) {}
}
4

3 回答 3

1

我有一个 JComboBox,一开始只有一个值,并且有一个 MouseListener 连接到它。当我单击 JComboBox 时,我用一些新值填充它

  1. Item(s) to JComboBoxon runtime 只能添加/删除/XxxComboBoxModel修改

  2. 在您将更改所有项目的情况下使用DefaultComboBoxModel

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

于 2013-05-10T08:56:23.880 回答
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) {
    }
}
于 2013-05-10T08:45:41.893 回答
0

尝试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();
             }
        }
于 2013-05-10T08:37:30.313 回答