2016-03-04 3 views
-1

Для задания Я пытаюсь создать приложение Fantasy Football; и я пытаюсь изменить формирование на основе того, что выбрано в JComboBox. Однако, который когда-либо делал выбор, он всегда застревает в первом индексе и не будет обновляться до более нового выбора независимо от того, что я делаю.getSelectedItem/Index для JComboBox не обновляется

У меня есть два класса: Fantasy и Dropdown (ActionListener для JComboBox), и поскольку сказано, что мне нужно использовать два отдельных класса, я не могу объединить их в один класс.

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; 
     } 

В настоящее время Выпадающий класс не является полным, и оно готово к печати образование для тестирования, но независимо от того, что я делаю, я получаю только «Выберите Формирование "для любого выбора, который я делаю.

Что я делаю неправильно или не хватает?

ответ

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

0

Вы не обновляете значение selected в ответ на изменение ComboBox.

+0

Как изменить значение выбранного? Я не сталкивался с проблемой, когда они были в одном классе, но только начинал, когда я их разделял. – Jinjinbug

1

Вы можете достичь этого, используя 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 
     } 
    } 
} 

Он будет работать.

UPDATE

Это может быть достигнуто за счет ActionListener тоже. Ниже перечислены некоторые различия в ActionListener и ItemListener.

ActionListener

  • ActionListener вызывается при изменении элемента в поле со списком, даже если элемент такой же, как и предыдущие.
  • Использование метода прослушивания actionPerformed метод вызывается только один раз при изменении элемента.

ItemListener

  • ItemListener вызывается при изменении элемента в поле со списком, и это не то же самое, что и предыдущий.
  • Когда вы используете ItemListener, метод itemStateChanged вызывается дважды, поэтому вам нужно проверить условие if (e.getStateChange() == ItemEvent.SELECTED) {, иначе метод выполняется дважды, когда вы выбираете новый элемент.
+0

Почему 'ItemListener' лучше, чем' ActionListener'? Вам действительно нужно знать, когда выбранный элемент изменяется во всплывающем окне? В принципе, все, что вы сделали, это именно то, что «ActionListener» будет делать без необходимости проверять причину события – MadProgrammer

+0

Oooh, мне нравятся сравнения, nice – MadProgrammer

+0

Если вы не добавили первый комментарий ... Я бы никогда не проверял разница..so спасибо. – ELITE

0

Вставьте эту строку кода в вашу программу, так что выбор JComboBox обновляется каждый раз, когда часть кода работает. Таким образом, вы всегда можете получить текущее значение JComboBox выбранный в данный момент:

jComboBox.setName(""); 

Например, вставить его, как это в вашем коде:

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