Người nghe thay đổi lựa chọn JComboBox?


145

Tôi đang cố gắng để một sự kiện bùng cháy bất cứ khi nào một sự lựa chọn được thực hiện từ a JComboBox.

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

Tôi đã thử sử dụng actionPerformed(), nhưng nó không bao giờ cháy.

JComboBoxNói ngắn gọn về việc ghi đè mô hình cho , tôi không có ý tưởng.

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

Chỉnh sửa: Tôi phải xin lỗi. Hóa ra tôi đã sử dụng một lớp con sai JComboBox, nhưng tôi sẽ để lại câu hỏi vì câu trả lời của bạn là tốt.


Câu hỏi tuyệt vời, vì tôi đã nhận thấy rằng ActionPerformed kích hoạt khi tải một hộp tổ hợp, nhưng KHÔNG chọn khi nào người ta mong đợi nó.
Brian Knoblauch

Câu trả lời:


160

Nó sẽ phản hồi với ActionListener , như thế này:

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

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


45
Tôi thích ItemListener hơn (chỉ cần đảm bảo kiểm tra ItemEvent để xem liệu đó là lựa chọn hay thậm chí bỏ qua). ActionListener có thể được kích hoạt ngay cả khi lựa chọn không thay đổi (nghĩa 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.
Dan Dyer

6
Tôi biết câu hỏi này đã cũ, nhưng để bổ sung, ActionListener cũng bị loại nếu phương thức addItem được gọi.
Gabriel Câmara

150

Mã ví dụ về ItemListenerviệc 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 vào JComboBox của bạn

addItemListener(new ItemChangeListener());

2
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, vì không có thay đổi trạng thái.
dmark

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

@dmark Cảm ơn, nhận xét của bạn đã giúp tôi giải quyết vấn đề :)
Tia


11

Ở đây đang tạo ComboBox thêm người nghe để thay đổi lựa chọn vật phẩm:

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
câu trả lời này tăng cường các câu trả lời trước đó trong đó ...? Xin đừng trùng lặp! Không liên quan: không bao giờ thực hiện bất kỳ kích thước / định vị thủ công nào của các thành phần, đó là nhiệm vụ độc quyền của Trình quản lý bố cục phù hợp
kleopatra

7

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

 int selectedIndex = myComboBox.getSelectedIndex();

-hoặc là-

Object selectedObject = myComboBox.getSelectedItem();

-hoặc là-

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

Tôi biết lý do tại sao điều này bị hạ cấp, nhưng tôi tin rằng những điểm hạ cấp đó 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 điều này hoạt động. Nó bắn và loại trừ -1 sự kiện sẽ cho phép bạn loại trừ việc bắn sai khi bắt đầu. Giải quyết vấn đề của tôi!
Brian Knoblauch

4

Gần đây tôi đã tìm kiếm giải pháp rất giống nhau này và đã tìm được một giải pháp đơn giản mà không chỉ định các biến cụ thể cho mục được chọn cuối cùng và mục đượ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ó sẽ giải quyết vấn đề của bạn và những người khác. Cảm ơn.

Làm thế nào để tôi có được mục trước hoặc cuối cùng?

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.