当前位置: 首页 > 知识库问答 >
问题:

为什么我的JComboBox的ComboBoxModel从来不调用seSelectedItem()?

东郭京
2023-03-14

在我的swing应用程序中有两个组合框--在下面的代码中,您将看到Spring的元素,因为我也在使用Spring。我不能删除spring,否则应用程序将停止工作,没有大量的重构工作来取代spring的位置,所以请不要问这个。在应用程序的默认启动时,当进入带有组合框的对话框时,它们应该不会显示任何选择,如果您单击该框打开以显示选项,则只有一个选项(“Add...”)。

问题是单击“Add...”后,选项关闭,但选择内容永远不会被替换。我想也许我需要添加一个ActionListener,但是ActionListener(它只是显示一个带有所选内容的消息选项窗格)似乎没有做任何事情--没有显示消息框。我最初开始自定义实现自己的ComboBoxModel,但后来将其改为从DefaultComboBoxModel扩展,并重写需要不同的方法,如getElementAt和getSize等。getSelectionItem在我最初的模型中工作得很好(扩展了缺省组合框模型,我删除了get和set选择项,因为缺省类对我来说是负责的,或者我认为是这样)。

我可能做错了什么或错过了什么?代码如下:

@Component
 public class WordInstancePartOfSpeechComboBoxModel extends DefaultComboBoxModel<PartOfSpeech> implements Serializable
{
    private static final long serialVersionUID = 2509351721137099113L;
    private static final Logger msObjLogger = LoggerFactory.getLogger(WordInstancePartOfSpeechComboBoxModel.class);

    private List<PartOfSpeech> mLstModel;

    @Autowired
    private WordInstancePartOfSpeechDialogController mObjDialogController;

    protected WordInstancePartOfSpeechDialogController getDialogController()
    {
        return(mObjDialogController);
    }

    public PartOfSpeech getElementAt(final int iIndex)
    {
        if(iIndex > 0)
            return(getModel().get(iIndex - 1));
        else if(iIndex == 0)
            return(new PartOfSpeech("Add..."));
        else
            return(null);
    }

    protected List<PartOfSpeech> getModel()
    {
        try
            {
            if(mLstModel == null)
                mLstModel = getDialogController().listPartOfSpeeches();
            }
        catch(SQLException objException)
            {
            msObjLogger.error("Error retrieving list of Parts of Speech...", objException);
            mLstModel = new ArrayList<PartOfSpeech>();
            }

        return(mLstModel);
    }

    public int getSize()
    {
        return(getModel().size() + 1);
    }
}

和Spring配置类中实现JComboBox的代码:

if(mCboWordInstancePartOfSpeech == null)
    {
    mCboWordInstancePartOfSpeech = new JComboBox<PartOfSpeech>(getWordInstancePartOfSpeechComboBoxModel());

    mCboWordInstancePartOfSpeech.setBorder(BorderFactory.createLoweredBevelBorder());
    mCboWordInstancePartOfSpeech.setFont(getDefaultFont());
    mCboWordInstancePartOfSpeech.addActionListener(new ActionListener()
    {   
        public void actionPerformed(final ActionEvent objActionEvent)
        {
            JComboBox<PartOfSpeech> cbo = ((JComboBox<PartOfSpeech>)(objActionEvent.getSource()));

            JOptionPane.showMessageDialog(null, "The selected item is" + cbo.getSelectedIndex(), "Success!", JOptionPane.INFORMATION_MESSAGE);
        }
    });
    }

return(mCboWordInstancePartOfSpeech);

共有1个答案

尉迟默
2023-03-14

我想通了--我需要在组合框提供的类中重写。equals()。这是没有意义的,因为我从来没有看到代码执行调用equals,我的代码只是使用indexOf和从list或至少collections中获得两者,这两个都不需要equals,但对于其他人来说-检查equals并放入一个,也许它会再次像老板一样工作!

 类似资料:
  • 问题内容: 我需要在组合框中输入组织的简称。问题是我 可以 在下拉列表中看到组织名称,但实际上 无法 选择它。我的错误在哪里? 设定模式: 提前致谢! 问题答案: 我怀疑这是您的方法使用而不是比较对象 考虑使用已经实现有用方法的DefaultComboBoxModel。 编辑 :同样根据文档,当调用setSelected时,您应该调用所有注册的对象。 使用a 非常简单。创建一个新添加元素,使其包含

  • 问题内容: Java 7中的JCombobox已更新为使用泛型-我一直认为它还没有做到,这有点疏忽,所以我很高兴看到这一更改。 但是,当尝试以这种方式使用JCombobox时,我意识到我期望使用这些泛型类型的方法仍然会返回 这到底是为什么呢?对我来说,这似乎是一个愚蠢的设计决定。我意识到底层的ListModel有一个通用方法,因此我将改用它- 但这似乎是可以在JComboBox本身上更改的某种回旋

  • 问题内容: 我的代码中有一个。我已添加。但是它还是没有被触发。我已经尝试了很多时间,但是没有找到解决方案。 但是控制台中没有任何内容。请建议我我在做什么错。 问题答案: FocusListener不是JComboBox的适当监听器,另外一个监听器可以创建无限循环(尤其是可编辑的JComboBox), 的FocusListener是异步的,有时是太难捕捉事件是正确的订单特别是在案件JComponen

  • 问题内容: 我正在使用带有ItemListener的JComboBox。更改值后,itemStateChanged事件将被调用两次。第一次调用,ItemEvent显示所选的原始项目。第二次显示正在由用户选择的项目。这是一些测试器代码: 因此,当我将组合框从“一个”更改为“三个”时,控制台显示: 我有没有办法告诉我使用ItemEvent,它是第二个项目(即用户选择的项目)?如果有人可以解释为什么两次

  • 问题内容: 我刚开始学习Ember.js(购买了PeepCode屏幕录像),并且从中学习得很顺利,但是在尝试编写我的第一个Ember应用程序时遇到了问题。 这是(嵌套的)路由映射: 这样就可以使用以下网址:domain.com/#/yokota-ab-japan/places/4c806eabd92ea093ea2e3872 是基地的编号(日本的一个空军基地) 是Foursquare上的场地的编号