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