2008-09-12 34 views
126

Tôi đang cố gắng tạo sự kiện để kích hoạt bất cứ khi nào lựa chọn được thực hiện từ JComboBox.JComboBox Selection Listener Listener?

Vấn đề tôi gặp phải là không có phương pháp rõ ràng là addSelectionListener().

Tôi đã cố gắng sử dụng actionPerformed() nhưng nó không bao giờ kích hoạt.

Viết tắt mô hình cho JComboBox Tôi hết ý tưởng.

Làm cách nào để nhận thông báo về thay đổi lựa chọn trên JComboBox?

Edit: tôi phải xin lỗi nó quay ra tôi đã sử dụng một lớp con misbehaving của JComboBox, nhưng tôi sẽ rời khỏi câu hỏi lên kể từ khi câu trả lời của bạn là tốt. Bắt đầu bỏ phiếu xuống. :)

+0

xuất sắc câu hỏi, vì tôi đã nhận thấy rằng actionPerformed cháy trên tải một combobox, nhưng không phải trên việc lựa chọn khi một sẽ mong đợi nó. –

Trả lời

129

Cần đáp ứng với ActionListeners, như thế này:

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

@John Calsbeek toàn đúng khi chỉ ra rằng addItemListener() sẽ làm việc, quá. Tuy nhiên, bạn có thể nhận được 2 ItemEvents, một cho việc bỏ chọn mục đã chọn trước đó và một cho việc chọn mục mới. Chỉ cần không sử dụng cả hai loại sự kiện!

+42

Tôi thích ItemListener hơn (chỉ cần đảm bảo kiểm tra ItemEvent để xem liệu nó có phải là lựa chọn hay bỏ chọn ngay cả).ActionListener có thể được kích hoạt ngay cả khi lựa chọn không thay đổi (tức là nếu người dùng nhấp vào mục đã chọn). Điều này có thể hoặc không thể là những gì bạn muốn. –

+4

Tôi biết câu hỏi này là cũ, nhưng để bổ sung, ActionListener cũng được kích hoạt nếu phương thức addItem được gọi. –

21

Tôi sẽ thử phương pháp itemStateChanged() của giao diện ItemListener nếu giải pháp của jodonnell không thành công.

7

Bạn có thể thử những

int selectedIndex = myComboBox.getSelectedIndex(); 

-hoặc-

Object selectedObject = myComboBox.getSelectedItem(); 

-hoặc-

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

Tôi biết lý do tại sao điều này đã được bình chọn, nhưng tôi tin rằng những downvotes nên được xem xét lại ... Nếu bạn kiểm tra chỉ mục được chọn trong phương thức actionPerformed, bạn sẽ thấy rằng nó hoạt động. Nó sẽ kích hoạt và không bao gồm -1 sự kiện sẽ cho phép bạn loại trừ quá trình kích hoạt sai khi bắt đầu. Giải quyết vấn đề của tôi! –

132

Mã ví dụ về ItemListener thực hiện

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

Bây giờ chúng tôi sẽ chỉ nhận được mục đã chọn.

Sau đó, chỉ cần thêm người nghe để JComboBox bạn

addItemListener(new ItemChangeListener()); 
+1

Tôi đã thử mã này, một vấn đề là khi tôi nhấp vào mục đã được chọn, người nghe sẽ không được kích hoạt, bởi vì không có thay đổi trạng thái. – dmark

+3

@dmark Tôi nghĩ điều này là hợp lý, không có gì thay đổi. Có lẽ bạn nên tổ chức lại hành động của bạn bằng cách nào đó để không phụ thuộc vào kịch bản như vậy. – Viacheslav

+0

@dmark Cảm ơn, bình luận của bạn đã giúp tôi giải quyết một câu hỏi :) – Tia

4

Gần đây tôi đang tìm kiếm giải pháp này rất giống nhau và được quản lý để tìm một đơn giản mà không gán biến cụ thể cho mục được chọn cuối cùng và mục đã chọn mới. Và câu hỏi này, mặc dù rất hữu ích, không cung cấp giải pháp tôi cần. Điều này giải quyết vấn đề của tôi, tôi hy vọng nó giải quyết của bạn và những người khác. Cảm ơn.

How do I get the previous or last item?

7

đây đang tạo một ComboBox thêm một người biết lắng nghe để thay đổi lựa chọn mục:

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

câu trả lời này nâng cao câu trả lời trước đó trong đó ...? Xin đừng lặp lại! Không liên quan: không bao giờ làm bất kỳ việc định kích thước/định vị thủ công các thành phần nào, đó là nhiệm vụ độc quyền của LayoutManager phù hợp – kleopatra

Các vấn đề liên quan