如何让 JComboBox 中的菜单保持打开状态?
How can I hold the menu open in the JComboBox?
我已经创建了一个自定义 JComboBox,因此如果我尝试打开我的组合框,我可以在描述附近看到复选按钮。还行吧。但是如果我想 select n 项我必须,打开 select 列表,然后检查一个项目,重新打开 select 列表, select 另一个项目,打开select 列表等...
我想打开 select 列表一次,然后 select 我想要的列表而不是关闭 select 列表。可以吗?
这是 CheckComboStore
public class CheckComboStore
{
String id;
Boolean state;
String nomeArticolo;
public CheckComboStore(String id, String nomeArticolo,Boolean state)
{
this.id = id;
this.nomeArticolo=nomeArticolo;
this.state = state;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public Boolean getState() {
return state;
}
public void setState(Boolean state) {
this.state = state;
}
public String getNomeArticolo() {
return nomeArticolo;
}
public void setNomeArticolo(String nomeArticolo) {
this.nomeArticolo = nomeArticolo;
}
}
这是创建带有复选按钮的组合框的代码
List<Articoli> listaArticoli = modelManager.getArticoliManager().estraiArticoli(false,false,false,false,false);
CheckComboStore[] stores = new CheckComboStore[listaArticoli.size()];
int i=0;
for(Iterator<Articoli>it=listaArticoli.iterator(); it.hasNext();){
Articoli art = it.next();
stores[i] = new CheckComboStore(art.getCodArticoloString(),art.getNomeArticolo(),false);
i++;
}
comboBoxArticoli = new ComboFormat(stores);
comboBoxArticoli.setRenderer(new CheckComboRenderer());
May be you can try adding a listener as shown below and when an item is selected you can use invokeLater
and keep the popup open.它可能不是确切的解决方案,但会给你一个想法。让我知道它是否适合你?
combo.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
if (e.getStateChange() == ItemEvent.SELECTED) {
if (e.getItem() == combo.getItemAt(0)) //some condition {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
combo.setSelectedItem(lastSelectedItem);
combo.showPopup();
}
});
} else {
lastSelectedItem = combo.getSelectedItem();
}
}
}
});
添加一个ItemListener
to your combo and override itemStateChanged
to call showPopup()
(but don't call it on the Event Dispatch Thread, use SwingUtilities.InvokeLater()
).
我已经创建了一个自定义 JComboBox,因此如果我尝试打开我的组合框,我可以在描述附近看到复选按钮。还行吧。但是如果我想 select n 项我必须,打开 select 列表,然后检查一个项目,重新打开 select 列表, select 另一个项目,打开select 列表等... 我想打开 select 列表一次,然后 select 我想要的列表而不是关闭 select 列表。可以吗?
这是 CheckComboStore
public class CheckComboStore
{
String id;
Boolean state;
String nomeArticolo;
public CheckComboStore(String id, String nomeArticolo,Boolean state)
{
this.id = id;
this.nomeArticolo=nomeArticolo;
this.state = state;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public Boolean getState() {
return state;
}
public void setState(Boolean state) {
this.state = state;
}
public String getNomeArticolo() {
return nomeArticolo;
}
public void setNomeArticolo(String nomeArticolo) {
this.nomeArticolo = nomeArticolo;
}
}
这是创建带有复选按钮的组合框的代码
List<Articoli> listaArticoli = modelManager.getArticoliManager().estraiArticoli(false,false,false,false,false);
CheckComboStore[] stores = new CheckComboStore[listaArticoli.size()];
int i=0;
for(Iterator<Articoli>it=listaArticoli.iterator(); it.hasNext();){
Articoli art = it.next();
stores[i] = new CheckComboStore(art.getCodArticoloString(),art.getNomeArticolo(),false);
i++;
}
comboBoxArticoli = new ComboFormat(stores);
comboBoxArticoli.setRenderer(new CheckComboRenderer());
May be you can try adding a listener as shown below and when an item is selected you can use invokeLater
and keep the popup open.它可能不是确切的解决方案,但会给你一个想法。让我知道它是否适合你?
combo.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
if (e.getStateChange() == ItemEvent.SELECTED) {
if (e.getItem() == combo.getItemAt(0)) //some condition {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
combo.setSelectedItem(lastSelectedItem);
combo.showPopup();
}
});
} else {
lastSelectedItem = combo.getSelectedItem();
}
}
}
});
添加一个ItemListener
to your combo and override itemStateChanged
to call showPopup()
(but don't call it on the Event Dispatch Thread, use SwingUtilities.InvokeLater()
).