Java JCombobox在按ENTER键时失去焦点

Java JCombobox在按ENTER键时失去焦点,java,swing,Java,Swing,UI由一个JCombobox和一个按钮组成。元素使用DefaultComboModel添加到jcomboBox。按下Enter键后,我使用SwingWorker的doInBackGround检索100k个条目,并使用done()在UI中显示。执行此操作时,焦点移动到按钮(P.S-I从未设置焦点)。我错在哪里 @Override public void keyPressed(final KeyEvent e) { EventQueue.invokeLater(new

UI由一个JCombobox和一个按钮组成。元素使用DefaultComboModel添加到jcomboBox。按下Enter键后,我使用SwingWorker的doInBackGround检索100k个条目,并使用done()在UI中显示。执行此操作时,焦点移动到按钮(P.S-I从未设置焦点)。我错在哪里

   @Override
    public void keyPressed(final KeyEvent e) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
             if (e.getKeyCode()==KeyEvent.VK_ENTER)
                {
                    addMessagePanel();
                    new ImportDetails().execute();

                }
             }

   public class ImportDetails extends SwingWorker<List<ListItem> , Void>
    {
    @Override
    protected List<ListItem> doInBackground() throws Exception {
        customizedfilteredList = optionPanel.getFilteredList(listItems, userTypedString);
        setCountInLabel(listItemsCombo.getItemCount(), listItems.size());
        return customizedfilteredList;
    }
    @Override
    protected void done() {
        try 
        {
            List<ListItem> filterList = get();
            if(filterList.size()==0)
                return;
            if(filterList.size() == 1 &&  filterList.get(0).getLabel().equals(userTypedString))
            {
                listItemsCombo.setEnabled(true);
                defaultComboModel = new DefaultComboBoxModel<>(filterList.toArray());
                setComboModel(defaultComboModel, userTypedString, false);
                setCountInLabel(defaultComboModel.getSize(), listItems.size());
                /*selectedItem = filterList.get(0);
                itemChanged();*/
                messagePanel.remove(progressLabel);
                changeLayout(messagePanel);
            }
@覆盖
按下公共无效键(最终键事件e){
invokeLater(新的Runnable(){
@凌驾
公开募捐{
如果(例如getKeyCode()==KeyEvent.VK_ENTER)
{
addMessagePanel();
新导入的详细信息().execute();
}
}
公共类导入详细信息扩展SwingWorker
{
@凌驾
受保护列表doInBackground()引发异常{
customizedfilteredList=optionPanel.getFilteredList(列表项,用户类型字符串);
setCountInLabel(listItemsCombo.getItemCount(),listItems.size());
返回customizedfilteredList;
}
@凌驾
受保护的void done(){
尝试
{
List filterList=get();
if(filterList.size()=0)
返回;
if(filterList.size()==1&&filterList.get(0.getLabel().equals(userTypedString))
{
listItemsCombo.setEnabled(true);
DefaultComboxModel=新的DefaultComboxModel(filterList.toArray());
setComboModel(defaultComboModel,userTypedString,false);
setCountInLabel(defaultComboModel.getSize(),listItems.size());
/*selectedItem=filterList.get(0);
itemChanged()*/
messagePanel.remove(progressLabel);
更改布局(消息面板);
}
按下Enter键时,焦点移到按钮

listItemsCombo.setEnabled(true);
意味着您在某个地方将其禁用,以便焦点转到下一个启用的组件(您案例中的按钮)

我猜您禁用组合框是为了阻止操作,但最好在侦听器中定义标志并跳过处理,或者让侦听器处理用户的选择,直到nexw组合框模型就绪

意味着您在某个地方将其禁用,以便焦点转到下一个启用的组件(您案例中的按钮)

我猜您禁用组合框是为了阻止操作,但最好在侦听器中定义标志并跳过处理,或者让侦听器处理用户的选择,直到nexw组合框模型就绪

意味着您在某个地方将其禁用,以便焦点转到下一个启用的组件(您案例中的按钮)

我猜您禁用组合框是为了阻止操作,但最好在侦听器中定义标志并跳过处理,或者让侦听器处理用户的选择,直到nexw组合框模型就绪

意味着您在某个地方将其禁用,以便焦点转到下一个启用的组件(您案例中的按钮)


我猜您禁用组合框是为了阻止操作,但最好在侦听器中定义标志并跳过处理或让侦听器处理用户的选择,直到nexw组合框模型准备就绪。

谢谢您的想法。但是在所有条目加载到组合框上之前,必须禁用组合框。是否有其他方法阻止m的焦点转到下一个jComponent?不要禁用它。制作一个只有一个灰色项目“Loading…”的虚拟模型。在加载开始前用虚拟模型替换模型,在新模型准备好后用新模型替换。谢谢你的想法。但是在所有条目加载到Combobox之前,Combobox必须被禁用。是否有其他方法防止焦点移动到下一个jComponent?不要禁用它。只使用一个灰色项创建虚拟模型“装载。。。“。在加载开始前用虚拟模型替换模型,在新模型准备好后用新模型替换。感谢您的想法。但是在所有条目加载到Combobox之前,Combobox必须被禁用。是否有其他方法防止焦点移动到下一个jComponent?不要禁用它。只使用一个灰色项创建虚拟模型“装载。。。“。在加载开始前用虚拟模型替换模型,在新模型准备好后用新模型替换。感谢您的想法。但是在所有条目加载到Combobox之前,Combobox必须被禁用。是否有其他方法防止焦点移动到下一个jComponent?不要禁用它。只使用一个灰色项创建虚拟模型“加载…”在加载开始前用假人替换模型,在新模型准备好后用新模型替换回模型。