java - 为什么我的 JComboBox 的 ComboBoxModel 从来没有调用 seSelectedItem()?
问题描述
我的 Swing 应用程序中有 2 个组合框 - 在下面的代码中,您将看到 Spring 的元素,因为我也在使用 Spring。我无法删除 spring,否则如果没有大量重构工作来取代 Spring,应用程序将停止工作,所以请不要问这个问题。在应用程序默认启动时,进入带有组合框的对话框时,它们应该不显示任何选择,如果您单击框打开以显示选项,则只有一个选项(“添加...”)。
问题是单击“添加...”后,选项关闭,但选择永远不会被替换。我想也许我需要添加一个 ActionListener 但 ActionListener(它只显示一个带有选择的消息选项窗格)似乎没有做任何事情 - 没有显示消息框。我最初开始自定义实现自己的 ComboBoxModel,但随后将其更改为从 DefaultComboBoxModel 扩展并覆盖需要不同的方法,例如 getElementAt 和 getSize 等。尽管在我的原始模型中 getSelectionItem 工作得很好(扩展默认组合框模型,我已经删除了 get 并将 Selection Item 设置为默认类为我解决了这个问题,或者我想)。
我可能做错了什么或错过了什么?这是代码:
@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);
解决方案
我想通了 - 我需要在组合框提供的类中覆盖 .equals() 。这没有任何意义,因为我从来没有看到执行调用 equals 的代码,而我的代码只使用 indexOf 并从列表或至少从集合中获取两者,这两个都不需要 equals 但对于其他任何人 - 检查 equals 并放入一个也许它会再次像老板一样工作!
推荐阅读
- javascript - 提醒用户每个数组值是否为数字
- vue.js - Django rest 框架在 400 Bad request 期间从响应中获取错误消息
- c# - 无限期地等待进程终止或某个状态
- javascript - 使用 javascript 循环为图像添加 alt
- node.js - Express 应用程序崩溃:将标头发送到客户端后无法设置标头
- airflow - 无法在 Airflow UI 中暂停或取消暂停 DAG
- node.js - Puppeteer 无法将 innerText 输入到网格单元格中
- jsp - 如何将 response.sendRedirect 重定向到弹出窗口?
- elasticsearch - 在数组类型的 ElasticSearch 字段中添加分析器
- python - 如何绘制带有注释的水平堆积条