2011-06-18 37 views
8

Tôi có thể chỉnh sửa JComboBox và muốn thêm giá trị cho nó từ đầu vào của nó, es khi tôi gõ một cái gì đó trong JComboBox và nhấn Enter Tôi muốn văn bản xuất hiện trong JComboBox danh sách:có thể chỉnh sửa JComboBox

public class Program extends JFrame 
    implements ActionListener { 
    private JComboBox box; 

    public static void main(String[] args) { 
     new Program().setVisible(true); 
    } 

    public Program() { 
     super("Text DEMO"); 
     setSize(300, 300); 
     setLayout(new FlowLayout()); 
     Container cont = getContentPane(); 
     box = new JComboBox(new String[] { "First", "Second", "..." }); 
     box.setEditable(true); 
     box.addActionListener(this); 
     cont.add(box); 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     box.removeActionListener(this); 
     box.insertItemAt(box.getSelectedItem(), 0); 
     box.addActionListener(this); 
    } 
} 

không may khi tôi nhấn nhập hai giá trị được chèn vào thay vì một giá trị.

Tại sao?

+0

Tôi đã sửa đổi bài đăng của bạn, vui lòng hoàn nguyên nếu ... – mKorbel

Trả lời

16

Từ API cho JComboBox:

Các ActionListener sẽ nhận được một ActionEvent khi một sự lựa chọn đã được thực hiện. Nếu hộp kết hợp có thể chỉnh sửa, thì ActionEvent sẽ được kích hoạt khi chỉnh sửa đã dừng.

Do đó, ActionListener của bạn được gọi hai lần.

Để chỉ làm tăng thêm các mục vào JComboBox khi chỉnh sửa, bạn có thể kiểm tra sự đúng ActionCommand như thế này:

@Override 
public void actionPerformed(ActionEvent e) { 
    if (e.getActionCommand().equals("comboBoxEdited")) { 
    //code 
    } 
} 

chỉnh sửa (-> sự kiện văn thread)

Như đã đề cập bởi trashgod, bạn cũng nên tạo và hiển thị khung của mình chỉ trong chuỗi gửi sự kiện:

public static void main(String[] args) { 
    SwingUtilities.invokeLater(new Runnable() { 
     @Override 
     public void run() { 
      new Program().setVisible(true); 
     } 
    }); 
} 
+2

+1 Đồng thời bắt đầu [chủ đề gửi sự kiện] (http://download.oracle.com/javase/tutorial/uiswing/concurrency/initial.html). – trashgod

+1

với đầu ra từ JComboBox đến bên ngoài f.e. với GUI là cái nhìn tốt hơn cho ItemListener, từ đầu ra từ JComboBox cho chính nó là bắt buộc Action +1 – mKorbel

+0

Chỉ cần một câu hỏi nhanh: Là actionCommand "comboBoxEdited" đã hét lên với người nghe tự động, hay tôi cần addActionCommand bằng cách nào đó? – Pureferret

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