Java 使用Swing从侦听器添加组合框值

Java 使用Swing从侦听器添加组合框值,java,swing,jcombobox,Java,Swing,Jcombobox,我不熟悉Swing。我需要从数据库中获取数据并在组合框中弹出,当组合框侦听器执行时,它需要加载值。我不确定哪里出错了,下面代码中的值没有显示。 如果我错了,谁能纠正我吗。 代码: 您可以将数组添加到jcombobox的下面comboBox.addItem(items)但是在重新分配jcombobox之后,紧接着,jcombobox comboBox=(jcombobox)event.getSource()。我相信您会希望在初始化后添加项目 通过使用模型保存数据来添加项目 DefaultCombo

我不熟悉Swing。我需要从数据库中获取数据并在组合框中弹出,当组合框侦听器执行时,它需要加载值。我不确定哪里出错了,下面代码中的值没有显示。 如果我错了,谁能纠正我吗。 代码:


您可以将数组添加到jcombobox的下面
comboBox.addItem(items)但是在重新分配jcombobox之后,紧接着,
jcombobox comboBox=(jcombobox)event.getSource()。我相信您会希望在初始化后添加项目

通过使用模型保存数据来添加项目

DefaultComboxModel m=新的DefaultComboxModel(项目));

comboBox.setModel(m)

尝试将弹出菜单侦听器添加到JComboBox,如:

comboBox.addPopupMenuListener( PopupMenuListener listener )
{

   protected void popupMenuWillBecomeVisible( PopupMenuEvent event )
   {
       //update your model
   }

}

如果我正确地阅读了您的需求,您是否希望等待加载带有列表的组合,直到他们单击组合的下拉箭头

[请记住,这不是加载组合框的典型方式]

如果是这样的话,几年前我也有一个类似的要求,那就是camickr帮助我解决问题(回到旧的Sun论坛上)

其想法是,表单上其他地方的用户输入将驱动组合的项目列表。导出此列表将是一个昂贵的数据库查询,因此我们不希望每次更改用户输入时都这样做。我们也不想要一个单独的“构建列表”按钮

import java.awt.*;
导入java.util.*;
导入javax.swing.*;
导入javax.swing.event.*;
/*
* https://community.oracle.com/thread/2225626
*/
@抑制警告(“全部”)
公共类DelayedComboxDemo实现Runnable
{
私人JCheckBox chkA、chkB、chkC;
私人JComboxCBoItems;
私有JFrame;
公共静态void main(字符串[]args)
{ 
invokeLater(新的delayedComboxDemo());
}
公开募捐
{
chkA=新JCheckBox(“A”);
chkB=新的JCheckBox(“B”);
chkC=新的JCheckBox(“C”);
cboItems=newjcombobox();
cboItems.setPrototypeDisplayValue(“X”);
JPanel p=新的JPanel();
p、 添加(chkA);
p、 添加(chkB);
p、 添加(chkC);
p、 添加(cboItems);
frame=新JFrame(“延迟组合框测试”);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
框架。添加(p);
框架。设置尺寸(300100);
frame.setLocationRelativeTo(空);
frame.setVisible(true);
cboItems.addPopupMenuListener(新的PopupMenuListener()
{
公共无效popupMenuCanceled(PopupMenuEvent e){}
public void popupMenuWillBecomeInvisible(PopupMenuEvent e){}
public void弹出菜单将变为可见(弹出菜单事件e)
{
重建列表();
}
});
}
私有void重建列表()
{
int oldCount=cboItems.getItemCount();
frame.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_Cursor));
//模拟长事务
尝试
{
睡眠(200);
}
catch(InterruptedException ex){}
//出于测试目的,只需在此处创建列表
向量项=新向量();
项目。添加(“”);
if(chkA.isSelected()){items.add(“A”);}
if(chkB.isSelected()){items.add(“B”);}
if(chkC.isSelected()){items.add(“C”);}
cboItems.setModel(新的DefaultComboxModel(项目));
/*
*如果使用Java5或早期的Java6.0,解决方法应该在6u25中修复。
*看http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4743225 
*/
if(oldCount!=cboItems.getItemCount())
{
cboItems.hidePopup();
cboItems.showPopup();
}
frame.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_Cursor));
}
}

是,我想在初始化后添加项目,但无法添加it@Navyah看我修改过的答案。我也试过了,但我无法选择其中的特定项目,它只选择了第一个value@Navyah您已将侦听器置于已更改状态的项上。如果您没有要开始的项,则无法更改状态。然后请告诉我应该使用哪个侦听器,我需要将数据库中的值加载到组合框中。但是这些值在初始化期间不会弹出,所以我尝试在事件侦听器期间弹出这些值。这是可行的,我也做过类似的事情,但是如果联系数据库或任何其他可能挂起的进程,我会害怕使用它。您显示了一个“等待”光标,这很好,但是如果与数据库联系的进程挂起,用户将无法取消。@很好,是的。实际代码可能会使用超时或按键组合来取消,或者在工作完成时使用中间弹出窗口,或者使用许多其他解决方案。与SO上的大多数工作示例一样(特别是带有Swing标记的),这只是一个概念验证存根,它回答了OP中的特定问题(我希望如此),并不打算成为一个生产就绪的通用解决方案。不同的人可能希望以不同的方式处理db挂起,这超出了问题的范围。
comboBox.addPopupMenuListener( PopupMenuListener listener )
{

   protected void popupMenuWillBecomeVisible( PopupMenuEvent event )
   {
       //update your model
   }

}
import java.awt.*;
import java.util.*;
import javax.swing.*;
import javax.swing.event.*;

/*
 * https://community.oracle.com/thread/2225626
 */
@SuppressWarnings("all")
public class DelayedComboBoxDemo implements Runnable
{
  private JCheckBox chkA, chkB, chkC;
  private JComboBox cboItems;
  private JFrame frame;

  public static void main(String[] args)
  { 
    SwingUtilities.invokeLater(new DelayedComboBoxDemo());
  }

  public void run()
  {
    chkA = new JCheckBox("A");
    chkB = new JCheckBox("B");
    chkC = new JCheckBox("C");

    cboItems = new JComboBox();
    cboItems.setPrototypeDisplayValue("X");

    JPanel p = new JPanel();
    p.add(chkA);
    p.add(chkB);
    p.add(chkC);
    p.add(cboItems);

    frame = new JFrame("Delayed ComboBox Test");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.add(p);
    frame.setSize(300, 100);
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);

    cboItems.addPopupMenuListener(new PopupMenuListener()
    {
      public void popupMenuCanceled(PopupMenuEvent e) {}
      public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {}

      public void popupMenuWillBecomeVisible(PopupMenuEvent e)
      {
        rebuildList();
      }
    });
  }

  private void rebuildList()
  {
    int oldCount = cboItems.getItemCount();

    frame.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));

    // simulate a long transaction
    try
    {
      Thread.sleep(200);
    }
    catch (InterruptedException ex) {}

    // for testing purposes, just create the list here
    Vector<String> items = new Vector<String>();
    items.add("");

    if (chkA.isSelected()) { items.add("A"); }
    if (chkB.isSelected()) { items.add("B"); }
    if (chkC.isSelected()) { items.add("C"); }

    cboItems.setModel(new DefaultComboBoxModel(items));

    /*
     * Workaround if using Java 5 or early Java 6. Should be fixed in 6u25.
     * See http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4743225 
     */
    if (oldCount != cboItems.getItemCount())
    {
      cboItems.hidePopup();
      cboItems.showPopup();
    }

    frame.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
  }
}