JCombobox在按下ENTER键时失去了注意力



UI由一个JCombobox和一个Button组成。元素是使用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);
            }

按下Enter键时,焦点移动到按钮上。

listItemsCombo.setEnabled(true);

意味着您在某个地方禁用了它,所以焦点转到下一个启用的组件(在您的情况下是按钮)。

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

最新更新