JComboBox Listener เปลี่ยนการเลือกผู้ฟัง?


145

JComboBoxฉันพยายามที่จะได้รับเหตุการณ์ไฟไหม้เมื่อใดก็ตามที่เป็นทางเลือกที่ทำจาก

ปัญหาที่ฉันมีอยู่ก็คือมันไม่ชัดเจน addSelectionListener()วิธีที่

ฉันพยายามใช้ actionPerformed()แต่มันไม่เคยไฟ

ย่อมาจากการเอาชนะโมเดลสำหรับ JComboBoxผมออกจากความคิด

ฉันจะได้รับแจ้งเกี่ยวกับการเปลี่ยนแปลงตัวเลือกใน JComboBoxอย่างไร **

แก้ไข:ฉันต้องขอโทษ ดูเหมือนว่าฉันใช้คลาสย่อยที่ทำงานผิดJComboBoxปกติ แต่ฉันจะทิ้งคำถามไว้เพราะคำตอบของคุณดี


คำถามที่ยอดเยี่ยมเนื่องจากฉันสังเกตเห็นว่า actionPerformed fires โหลด combobox แต่ไม่เลือกว่าจะคาดหวังเมื่อไหร่
Brian Knoblauch

คำตอบ:


160

ควรตอบสนองต่อActionListenersเช่นนี้:

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

@John Calsbeekชี้ให้เห็นอย่างถูกต้องว่าaddItemListener()จะใช้ได้เช่นกัน คุณอาจได้รับ 2 ItemEventsรายการสำหรับการยกเลิกรายการที่เลือกไว้ก่อนหน้าและอีกรายการหนึ่งสำหรับการเลือกรายการใหม่ อย่าใช้ทั้งสองประเภทเหตุการณ์!


45
ฉันต้องการ ItemListener (เพียงตรวจสอบให้แน่ใจว่าได้ตรวจสอบ ItemEvent เพื่อดูว่าเป็นการเลือกหรือการยกเลิกการเลือก) ActionListener สามารถเริ่มทำงานได้แม้ว่าการเลือกจะไม่เปลี่ยนแปลง (เช่นหากผู้ใช้คลิกที่รายการที่เลือกไว้แล้ว) นี่อาจเป็นหรือไม่ใช่สิ่งที่คุณต้องการ
Dan Dyer

6
ฉันรู้ว่าคำถามนี้เก่า แต่เพื่อที่จะเติมเต็ม ActionListener ก็จะถูกไล่ออกถ้ามีการเรียกเมธอด addItem
Gabriel Câmara

150

ตัวอย่างรหัสของItemListenerการนำไปใช้

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

ตอนนี้เราจะได้รับเฉพาะรายการที่เลือก

จากนั้นเพียงเพิ่มผู้ฟังลงใน JComboBox ของคุณ

addItemListener(new ItemChangeListener());

2
ฉันลองใช้รหัสนี้ปัญหาหนึ่งคือเมื่อฉันคลิกรายการที่เลือกไว้แล้วผู้ฟังจะไม่ถูกทริกเกอร์เนื่องจากไม่มีการเปลี่ยนแปลงสถานะ
dmark

4
@dmark ฉันคิดว่านี่สมเหตุสมผลพอทำให้ไม่มีอะไรเปลี่ยนแปลง บางทีคุณควรจัดระเบียบการกระทำของคุณใหม่เพื่อไม่ให้พึ่งพาสถานการณ์ดังกล่าว
Viacheslav

@dmark ขอขอบคุณความคิดเห็นของคุณช่วยให้ฉันแก้ ques :)
เตี้ย


11

นี่คือการสร้าง ComboBox เพิ่มฟังสำหรับการเปลี่ยนแปลงการเลือกรายการ:

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
คำตอบนี้ช่วยเพิ่มคำตอบก่อนหน้าในที่ ... ? โปรดอย่าทำซ้ำ! ไม่เกี่ยวข้อง: ไม่เคยทำการปรับขนาด / ค้นหาส่วนประกอบด้วยตนเองเลยนับเป็นงานพิเศษของ LayoutManager ที่เหมาะสม
kleopatra

7

คุณอาจลองสิ่งเหล่านี้

 int selectedIndex = myComboBox.getSelectedIndex();

-หรือ-

Object selectedObject = myComboBox.getSelectedItem();

-หรือ-

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

ฉันรู้ว่าทำไมสิ่งนี้ถึง downvote แต่ฉันเชื่อว่า downvotes เหล่านั้นควรได้รับการพิจารณาใหม่ ... หากคุณตรวจสอบดัชนีที่เลือกในวิธีการ actionPerformed คุณจะพบว่ามันใช้งานได้ มันใช้งานได้และการยกเว้น -1 เหตุการณ์จะช่วยให้คุณสามารถแยกการยิงผิดพลาดเมื่อเริ่มต้น แก้ไขปัญหาของฉัน!
Brian Knoblauch

4

เมื่อเร็ว ๆ นี้ฉันกำลังมองหาวิธีแก้ปัญหาที่เหมือนกันนี้และพยายามหาวิธีง่ายๆโดยไม่ต้องกำหนดตัวแปรเฉพาะสำหรับรายการที่เลือกล่าสุดและรายการที่เลือกใหม่ และคำถามนี้มีประโยชน์มาก แต่ไม่ได้ให้วิธีแก้ปัญหาที่ฉันต้องการ นี่เป็นการแก้ไขปัญหาของฉันฉันหวังว่าจะช่วยคุณและผู้อื่นได้ ขอบคุณ

ฉันจะรับไอเท็มก่อนหน้าหรือไอเท็มสุดท้ายได้อย่างไร?

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.