JComboBox Seçimi İşleyici Değiştirilsin mi?


147

A'dan bir seçim yapıldığında bir olayın ateşlenmesini sağlamaya çalışıyorum JComboBox.

Yaşadığım sorun, bariz bir addSelectionListener()yöntem olmaması .

Kullanmayı denedim actionPerformed()ama hiç ateşlenmiyor.

Modeli geçersiz kılmanın kısası, fikirim JComboBoxtükendi.

Bir seçim değişikliğinden nasıl haberdar olurum JComboBox? **

Düzenleme: Özür dilemeliyim. Görünüşe göre yanlış davranan bir alt sınıf kullanıyordum JComboBox, ama cevabınız iyi olduğu için soruyu açık bırakacağım.


Harika bir soru, çünkü actionPerformobox yüklenirken ateşlendiğini fark ettim, ancak ne zaman bekleneceğini seçmedim.
Brian Knoblauch

Yanıtlar:


164

ActionListeners'a şu şekilde yanıt vermelidir :

combo.addActionListener (new ActionListener () {
    public void actionPerformed(ActionEvent e) {
        doSomething();
    }
});

@John Calsbeek , bunun addItemListener()da işe yarayacağını haklı olarak işaret ediyor . ItemEventsYine de, biri önceden seçilen öğenin seçimini kaldırmak için ve diğeri yeni öğenin seçimi için 2 tane alabilirsiniz . Sadece her iki olay türünü de kullanmayın!


46
ItemListener'ı tercih ederim (sadece bir seçim mi yoksa seçimin kaldırılması mı olduğunu görmek için ItemEvent'i kontrol ettiğinizden emin olun). ActionListener, seçim değişmemiş olsa bile çalıştırılabilir (yani, kullanıcı önceden seçilmiş öğeyi tıklarsa). İstediğiniz bu olabilir veya olmayabilir.
Dan Dyer

6
Bu sorunun eski olduğunu biliyorum, ancak tamamlayıcı olması için, addItem yöntemi çağrılırsa ActionListener da çalıştırılır.
Gabriel Câmara

155

Kod ItemListeneruygulama örneği

class ItemChangeListener implements ItemListener{
    @Override
    public void itemStateChanged(ItemEvent event) {
       if (event.getStateChange() == ItemEvent.SELECTED) {
          Object item = event.getItem();
          // do something with object
       }
    }       
}

Şimdi sadece seçilen öğeyi alacağız.

Ardından JComboBox'ınıza dinleyici ekleyin

addItemListener(new ItemChangeListener());

2
Bu kodu denedim, sorunlardan biri, halihazırda seçilmiş olan öğeyi tıkladığımda, dinleyicinin tetiklenmemesi çünkü durum değişikliği yok.
dmark

4
@dmark Bunun makul olduğunu düşünüyorum, çünkü hiçbir şey değişmedi. Belki de böyle bir senaryoya bağlı kalmamak için eylemlerinizi bir şekilde yeniden düzenlemelisiniz.
Viacheslav

@dmark Teşekkürler, yorumunuz bir soruyu çözmeme yardımcı oldu :)
Tia


11

Öğe seçimi değişikliği için bir dinleyici ekleyen bir ComboBox oluşturmak:

JComboBox comboBox = new JComboBox();

comboBox.setBounds(84, 45, 150, 20);
contentPane.add(comboBox);

JComboBox comboBox_1 = new JComboBox();
comboBox_1.setBounds(84, 97, 150, 20);
contentPane.add(comboBox_1);
comboBox.addItemListener(new ItemListener() {
    public void itemStateChanged(ItemEvent arg0) {
        //Do Something
    }
});

4
bu cevaplar önceki cevapları geliştiriyor ...? Lütfen çoğaltmayın! İlgisiz: -hiç herhangi bir manuel boyutlandırma yapmak / bileşenlerin yerini, yani uygun bir LayoutManager münhasır bir görev
kleopatra

8

Bunları deneyebilirsin

 int selectedIndex = myComboBox.getSelectedIndex();

-veya-

Object selectedObject = myComboBox.getSelectedItem();

-veya-

String selectedValue = myComboBox.getSelectedValue().toString();

Bunun neden olumsuz oy verildiğini biliyorum, ancak bu olumsuz oyların yeniden değerlendirilmesi gerektiğine inanıyorum ... ActionPerformed yönteminde seçilen dizini kontrol ederseniz, bunun işe yaradığını göreceksiniz. Ateşliyor ve -1 olayları hariç tutmak, başlangıçta yanlış ateşlemeyi hariç tutmanıza izin verecektir. Sorunumu çözdüm!
Brian Knoblauch

JComboBox için uygun yöntemlere hızlı bir referans olması durumunda faydalı bir cevap.
Orwellophile

4

Geçenlerde aynı çözümü arıyordum ve son seçilen öğe ve yeni seçilen öğe için belirli değişkenler atamadan basit bir çözüm bulmayı başardım. Ve bu soru çok yardımcı olmasına rağmen ihtiyacım olan çözümü sağlamadı. Bu benim sorunumu çözdü, umarım sizinkini ve diğerlerini çözer. Teşekkürler.

Önceki veya son öğeyi nasıl alırım?


0

bunu jdk> = 8 ile yapabilirsiniz

getUyapComboBox().addItemListener(this::comboBoxitemStateChanged);

yani

public void comboBoxitemStateChanged(ItemEvent e) {
    if (e.getStateChange() == ItemEvent.SELECTED) {
        YourObject selectedItem = (YourObject) e.getItem();
        //TODO your actitons
    }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.