【问题标题】:getSelectedItem/Index for JComboBox not updatingJComboBox 的 getSelectedItem/Index 未更新
【发布时间】:2016-03-04 04:26:42
【问题描述】:

我正在尝试创建一个 Fantasy Football 应用程序;我正在尝试根据在 JComboBox 中选择的内容来更改格式。但是,无论我做什么选择,它总是停留在第一个索引上,并且无论我做什么都不会更新到新的选择。

我有两个类,Fantasy 和 Dropdown(JComboBox 的 ActionListener),并且由于声明我需要使用两个单独的类,所以我不能将它们合并到一个类中。

public class Fantasy extends JFrame
    {   
        String[] formationoptions = {"Select Formation", "4-4-2", "4-3-3", "3-5-2", "5-3-2", "3-4-3", "4-5-1"};
        JComboBox<String> formation = new JComboBox<String>(formationoptions);

        public Fantasy()
        {
            super("Fantasy Football");

            this.setLayout(new BorderLayout());
            this.setSize(400, 600);
            this.add(formation, BorderLayout.NORTH);
            formation.setSize(400, 25);
            this.setVisible(true);

            formation.addActionListener(new Dropdown((String) formation.getSelectedItem()));
        }
    }

Dropdown.java

    public class Dropdown implements ActionListener
    {
        public String selected;
        public String a = "Select Formation";
        public String b = "4-4-2"; 
        public String c = "4-3-3";
        public String d = "3-5-2";
        public String e = "5-3-2"; 
        public String f = "3-4-3";
        public String g = "4-5-1";

        @Override
        public void actionPerformed(ActionEvent e) 
        {
            if (selected.equals(a))
            {
                System.out.println(a);
            }
            if (selected.equals(b))
            {
                System.out.println(b);
            }
            if (selected.equals(c))
            {
                System.out.println(c);
            }
            if (selected.equals(d))
            {
                System.out.println(d);
            }
            if (selected.equals(e))
            {
                System.out.println(e);
            }
            if (selected.equals(f))
            {
                System.out.println(f);
            }
            if (selected.equals(g))
            {
                System.out.println(g);
            }
        }

        public Dropdown(String selected)
        {
            this.selected = selected;
        }

目前Dropdown类不完整,它被设置为打印队形进行测试,但无论我做什么,我所做的任何选择都只会打印“选择队形”。

我做错了什么或错过了什么?

【问题讨论】:

    标签: java swing actionlistener jcombobox


    【解决方案1】:

    因此,与其打印永远不会改变的selected,不如检查JComboBox 本身并询问它选择的值是什么...

    public class Dropdown implements ActionListener {
    
        public String selected;
    
        @Override
        public void actionPerformed(ActionEvent e) {
            JComboBox cb = (JComboBox) e.getSource();
            System.out.println(cb.getSelectedItem());
        }
    
        public Dropdown(String selected) {
            this.selected = selected;
    
        }
    }
    

    然后,您可以将selected 值更新为JComboBox 实际选择的值

    【讨论】:

      【解决方案2】:

      您可以使用ItemListener 实现此目的。

      formation.addItemListener(new Dropdown());
      

      并以此更改Dropdown 的类定义

      public class Dropdown implements ItemListener {
          public String a = "Select Formation";
          public String b = "4-4-2"; 
          public String c = "4-3-3";
          public String d = "3-5-2";
          public String e = "5-3-2"; 
          public String f = "3-4-3";
          public String g = "4-5-1";
      
          @Override
          public void itemStateChanged(ItemEvent e) {
              if (e.getStateChange() == ItemEvent.SELECTED) {
                 String selected = ((JComboBox)e.getSource())
                                     .getSelectedItem().toString();
                 System.out.println(selected);
                 // write here if else ladder or switch case
              }
          }
      }
      

      它会起作用的。

      更新

      这也可以通过ActionListener 实现。我在这里列出了ActionListenerItemListener 的一些区别。

      ActionListener

      • ActionListener 会在您更改组合框中的元素时调用,即使元素与之前的相同。
      • 使用动作监听器actionPerformed 方法在您更改元素时只调用一次。

      ItemListener

      • ItemListener 会在您更改组合框中的元素时被调用,并且与之前的不同。
      • 当你使用ItemListener时,itemStateChanged方法被调用了两次,所以你必须检查条件if (e.getStateChange() == ItemEvent.SELECTED) {,否则当你选择新元素时该方法会执行两次。

      【讨论】:

      • 为什么ItemListenerActionListener 更好?您真的需要知道弹出窗口中所选项目何时更改吗?基本上你所做的正是ActionListener 所做的,而无需检查事件的原因
      • 哦,我喜欢比较,很好
      • 如果您没有添加第一条评论..我永远不会检查差异..所以谢谢。
      【解决方案3】:

      将这行代码插入您的程序,以便每次运行该部分代码时刷新 jComboBox 选择。这样,您将始终获得当前选定的当前 jComboBox 值:

      jComboBox.setName("");
      

      例如,在您的代码中插入它:

      public Dropdown(String selected)
          {
              this.selected = selected;
              jComboBoxcb.setName("");
          }
      

      【讨论】:

        【解决方案4】:

        您永远不会更新 selected 的值以响应 ComboBox 的变化。

        【讨论】:

        • 如何更新 selected 的值?他们在同一个班级的时候我没有遇到问题,但直到我分开他们才开始发生。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多