2015-01-23 2 views
1

Я начал создавать небольшое приложение, где пользователь должен выбрать свою провинцию из выпадающего списка, я добавил слушателя действий в поле со списком. Я хотел протестировать ActionListener, поэтому я просто распечатал то, что было выбрано на консоль. По какой-то причине кажется, что я возвращаю значение combobox дважды. Например, я выбираю «Альберта» в поле со списком, «Альберта Альберта» печатается на консоли. Кто-нибудь может понять, почему это может быть?JComboBox возвращает двойное значение

JComboBox comboProv = new JComboBox(provinces); 
     comboProv.setBounds(40, 79, 137, 24); 
     contentPane.add(comboProv); 
     comboProv.addItemListener(new ItemListener() { 
      public void itemStateChanged(ItemEvent e) { 
       String selectedProv = (String)comboProv.getSelectedItem(); 
       System.out.print(selectedProv); 
      } 
     }); 

ответ

2

Вы не добавить ActionListener, вы добавляете ItemListener, a ItemListener будет уведомлено дважды, когда значение изменится, один раз для события ItemEvent.DESELECTED и один раз для ItemEvent.SELECTED.

Если вы не заинтересованы в изменении выбора просто использовать ActionListener

comboProv.addActionListener(new ActionListener() { 
    @Override 
    public void actionPerformed(ActionEvent e) { 
     String selectedProv = (String)comboProv.getSelectedItem(); 
     System.out.print(selectedProv); 
    } 
}); 

Каким будет уведомлены только один раз

Избегайте использование null макетов, пиксельные совершенные макеты иллюзия в современном ш дизайн. Слишком много факторов, которые влияют на индивидуальный размер компонентов, ни один из которых вы не можете контролировать. Swing был разработан для работы с менеджерами компоновки в ядре, отбросив их, не будет конца проблем и проблем, которые вы будете тратить все больше и больше времени на исправление.

+0

Огромное спасибо, даже не осознанный. Просто возвращаюсь к этому через некоторое время, поэтому я ржавый. – Kalkrin

1

положить это внутри слушателя .. Это напечатанной в два раза, потому что он вызывается для selected и deselected .. поэтому добавить это фильтр

if (e.getStateChange() == ItemEvent.SELECTED) { 
       String selectedProv = (String)comboProv.getSelectedItem(); 
       System.out.print(selectedProv);. 
    } else if(e.getStateChange() == ItemEvent.DESELECTED){ 
       //Do any operations you need to do when an item is de-selected. 
    }  
Смежные вопросы