我有一个JComboBox
,一开始只有一个值,并且有一个MouseListener连接到它。当我点击JComboBox
时,我会用一些新值填充它。但是popupMenu在JComboBox
上第一次点击时的大小就是一个元素。第二次所有值都显示为正常。
知道如何在更新内容后直接更新comboBox的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) {}
}
答案 0 :(得分: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) {
}
}
答案 1 :(得分:1)
我有一个JComboBox,在开始时只有一个值,并且有一个 MouseListener连接到它。当我点击JComboBox时,我填写它 有一些新的值
Item
到JComboBox
只能添加/删除/修改为XxxComboBoxModel
如果您要更改所有商品,请使用DefaultComboBoxModel
使用MutableComboBoxModel在运行时添加/删除/修改项目
答案 2 :(得分: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();
}
}