Pilihan Ubah JComboBox Listener?


145

Saya mencoba membuat acara untuk memecat kapan saja pilihan dibuat JComboBox.

Masalah yang saya alami adalah tidak ada addSelectionListener()metode yang jelas .

Saya sudah mencoba menggunakannya actionPerformed(), tetapi tidak pernah menyala.

Singkat dari mengganti model untuk JComboBox, saya kehabisan ide.

Bagaimana saya mendapat pemberitahuan tentang perubahan pilihan pada JComboBox? **

Sunting: Saya harus minta maaf. Ternyata saya menggunakan subclass nakal JComboBox, tapi saya akan meninggalkan pertanyaan karena jawaban Anda baik.


Pertanyaan yang bagus, karena saya perhatikan bahwa actionPerformed kebakaran saat memuat kotak kombo, tapi BUKAN memilih saat orang mengharapkannya.
Brian Knoblauch

Jawaban:


160

Itu harus menanggapi ActionListeners , seperti ini:

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

@John Calsbeek dengan tepat menunjukkan bahwa itu juga addItemListener()akan berhasil. Anda bisa mendapatkan 2 ItemEvents, satu untuk pemilihan item yang dipilih sebelumnya, dan satu lagi untuk pemilihan item baru. Hanya saja, jangan gunakan kedua jenis acara!


45
Saya lebih suka ItemListener (pastikan untuk memeriksa ItemEvent untuk melihat apakah itu pemilihan atau bahkan pemilihan). ActionListener dapat dipecat bahkan jika pemilihannya tidak berubah (yaitu jika pengguna mengklik item yang sudah dipilih). Ini mungkin atau mungkin bukan yang Anda inginkan.
Dan Dyer

6
Saya tahu pertanyaan ini sudah lama, tetapi untuk melengkapi, ActionListener juga dipecat jika metode addItem dipanggil.
Gabriel Câmara

150

Contoh kode ItemListenerimplementasi

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

Sekarang kita hanya akan mendapatkan item yang dipilih.

Kemudian tambahkan saja pendengar ke JComboBox Anda

addItemListener(new ItemChangeListener());

2
Saya mencoba kode ini, satu masalah adalah ketika saya mengklik item yang sudah dipilih, pendengar tidak akan dipicu, karena tidak ada perubahan status.
dmark

4
@ tanda Saya pikir ini masuk akal, karena tidak ada yang berubah. Mungkin Anda harus mengatur ulang tindakan Anda entah bagaimana untuk tidak bergantung pada skenario seperti itu.
Viacheslav

@ tanda Terima kasih, komentar Anda membantu saya memecahkan pertanyaan :)
Tia


11

Di sini adalah menciptakan ComboBox menambahkan pendengar untuk perubahan pemilihan item:

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

3
jawaban ini meningkatkan jawaban sebelumnya dalam hal itu ...? Tolong jangan duplikat! Tidak terkait: tidak pernah melakukan pengukuran / penempatan komponen secara manual, itulah tugas eksklusif LayoutManager yang cocok
kleopatra

7

Anda dapat mencoba ini

 int selectedIndex = myComboBox.getSelectedIndex();

-atau-

Object selectedObject = myComboBox.getSelectedItem();

-atau-

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

Saya tahu mengapa ini diturunkan, tapi saya percaya downvote itu harus dipertimbangkan kembali ... Jika Anda memeriksa indeks yang dipilih dalam metode actionPerformed, Anda akan menemukan bahwa ini berhasil. Itu memang menyala, dan mengecualikan -1 peristiwa akan memungkinkan Anda untuk mengecualikan penembakan palsu saat start. Memecahkan masalah saya!
Brian Knoblauch

4

Saya baru-baru ini mencari solusi yang sama dan berhasil menemukan yang sederhana tanpa menetapkan variabel spesifik untuk item yang dipilih terakhir dan item yang baru dipilih. Dan pertanyaan ini, meskipun sangat membantu, tidak memberikan solusi yang saya butuhkan. Ini menyelesaikan masalah saya, saya harap ini bisa menyelesaikan masalah Anda dan orang lain. Terima kasih.

Bagaimana saya mendapatkan item sebelumnya atau terakhir?

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.