2015-05-23 3 views
1

Когда я нажимаю на элемент JComboBox, чтобы показать JoptionPane с текстом выбранного элемента, он отображается два раза. Как я могу удалить событие прослушивателя элемента?JoptionPane отображается два раза, когда выбран элемент списка

import java.awt.event.ItemEvent; 
import java.awt.event.ItemListener; 
import javax.swing.*; 

public class Combo implements ItemListener { 

    JFrame f; 
    JComboBox cb; 

    Combo() { 
     f = new JFrame("Combo ex"); 

     String country[] = {"India", "Aus", "U.S.A", "England", "Newzeland"}; 

     cb = new JComboBox(country); 
     cb.setBounds(50, 50, 90, 20); 
     f.add(cb); 
     cb.addItemListener(this); 
     f.setLayout(null); 
     f.setSize(400, 500); 
     f.setVisible(true); 

    } 

    public static void main(String[] args) { 
     new Combo(); 

    } 

    @Override 
    public void itemStateChanged(ItemEvent e) { 
     if (e.getSource()==cb) { 
      String seleccionado=(String)cb.getSelectedItem(); 
      JOptionPane.showMessageDialog(f, seleccionado); 
     } 
    } 
} 

ответ

1

Вы хотите избежать переопределения элементаStateChanged(). Изменение состояния элемента в itemStateChanged вызывает увольнение itemStateChanged ... поэтому вы видите диалог дважды. Вместо этого вы должны использовать ActionListener.

I немного изменен ваш код в качестве примера. Теперь он должен отображать только 1 диалоговое окно.

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.*; 


public class Combo{ 

    JFrame frame; 
    JComboBox cb; 

    Combo() { 
     frame = new JFrame("Combo ex"); 

     String country[] = {"India", "Aus", "U.S.A", "England", "Newzeland"}; 

     cb = new JComboBox(country); 
     cb.setBounds(50, 50, 90, 20); 
     cb.addActionListener(new ActionListener(){ 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       String seleccionado=(String)cb.getSelectedItem(); 
       JOptionPane.showMessageDialog(frame, seleccionado); 
      } 
     }); 
     frame.add(cb); 
     frame.setLayout(null); 
     frame.setSize(400, 500); 
     frame.setVisible(true); 

    } 

    public static void main(String[] args) { 
     new Combo(); 

    } 

} 
+0

большое спасибо. Очень просто ваш код –

1

Проблема, itemStateChanged() вызывается, когда выбран или не выбран пользователем элемент. Говоря простыми словами, когда вы выбираете новый элемент, вы также не выбираете старый элемент.

Попробуйте это:

if (e.getSource()==cb && e.getStateChange() == ItemEvent.SELECTED) { 
    // 
} 

getStateChange() возвращает тип изменения состояния (выбранный или неустановленный).

+0

работал отлично. Не могли бы вы объяснить эту строку кода e.getStateChange() == ItemEvent.SELECTED –

Смежные вопросы