为什么getSelectedItem返回null?

3

我刚开始学习面向对象编程,请见谅这篇基础帖子。当我尝试获取我的 JComboBox 中选定项的值时,我不知道为什么会返回 null。

public class AddEmployee extends javax.swing.JInternalFrame{
   public AddEmployee() 
    {
    initComponents();
    this.setSize(1100,500);
    setMonths();
    setJComboBoxProperties();
    check();
    }

    private void setMonths()
    {
       String[] monthsObj = {"January", "February", "March", "April", "May", "June", "July",
    "August", "September", "October", "November", "December"};

       DefaultComboBoxModel monthsModel = new DefaultComboBoxModel(monthsObj);

       cbMonths.setModel((ComboBoxModel)monthsModel);

    }

    private void setJComboBoxProperties()
    {
      cbMonths.setSelectedIndex(-1);
    }

    private String check()
    {
       String cb = (String)cbMonths.getSelectedItem();
       System.out.println(cb);
       return cb;
    }

}

我将String cb转换为非空值,但仍无法获取所选项目,仍然返回null。


3
cbMonth被声明在哪里?哪里选择了一个条目? - Jens
@Jens 顺便说一下,这是拖放操作。这就是为什么我没有创建 JComboBox 的实例 :) - John Francis
拖放?您必须声明cbMounth。 - Jens
如果他没有声明cbMonth,那么它就无法编译。我认为他是在使用图形GUI编辑器,并且cbMonth已经在自动生成的代码中声明了。 - daiscog
2个回答

2

在初始化组合框后调用setSelectedItem。请参阅文档

  DefaultComboBoxModel monthsModel = new DefaultComboBoxModel(monthsObj);
  monthsModel.setSelectedItem('September');

不,我只是想检查用户选择了下拉菜单中的哪个项目。 - John Francis
2
@JohnFrancis 如果你得到了 null,那么用户没有选择任何条目。请查看我提供的文档,“组合框的值为所选内容或 null”。 - Jens
请检查 getSelectedIndex()。如果未选择应返回 -1 - dieter
1
@dit OP调用的是getSelectedItem而不是getSelectedIndex,请仔细阅读问题。 - Jens
@Jens 是的,我使用了String cb = (String)cbMonths.getSelectedItem();来进行检查。但是当程序启动时,它总是给出第一个元素。当我从下拉列表中选择一个项目时,它不会打印任何东西? :D - John Francis
显示剩余9条评论

2
你正在调用 cbMonths.setSelectedIndex(-1);。根据文档,这将不选择任何项目(null)作为选定项。
在用户更改选择之前,getSelectedItem()将始终返回null。这是正确的、经过记录的行为。

我试图删除 setSelectedIndex(-1);,第一个元素是一月,对吗?它总是打印第一个元素,但当我选择其他元素时,它什么也不打印。我该如何解决这个问题? - John Francis
当用户更改选择时,您需要添加一个监听器来响应ActionEvent的触发。请参见此问题:https://dev59.com/dHVD5IYBdhLWcg3wL4iM - daiscog
起初我以为我不会使用监听器。这是JComboBox的实际行为吗?只是问一下 :D - John Francis
是的。在你的代码中,你是在任何人改变它之前打印所选项目。如果你想每次更改时打印所选项目,那么你需要对用户更改值做出反应。这就是监听器的作用;它们允许你对事件做出反应。当然,还有其他触发器可以打印该值,比如点击其他东西、定期计时器或任何你想要的东西。 - daiscog

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接