2012-10-05 30 views
5

tôi có:Java Swing - Làm thế nào để xử lý Generics trong ActionListener

class CustomerActionListener implements ActionListener 
{ 
    @Override 
    public void actionPerformed(ActionEvent event) 
    { 
    JComboBox cb = (JComboBox)event.getSource(); 
    .. do something 
    } 
} 

nào gây ra cảnh báo trình biên dịch sau trong JDK7:

JComboBox là một loại nguyên liệu. Tài liệu tham khảo để chung loại JComboBox nên tham số

Tôi đã cố gắng để parameterize nó để sao cho:

JComboBox<String> cb = (JComboBox<String>)event.getSource(); 

Nhưng điều này vẫn còn để cảnh báo trình biên dịch như sau:

Loại an toàn: không đánh dấu cast từ đối tượng đến JComboBox

Vì vậy, tôi không chắc chắn cách loại bỏ cảnh báo trình biên dịch ...

+0

Trường hợp có kiểm tra trợ giúp không? Ngay cả khi bạn biết bạn sẽ luôn luôn nhận được một JComboBox ở cuối. – Rex

+0

Tôi không nghĩ rằng bạn "mã" một giải pháp để giải quyết vấn đề. Bạn có thể, bao giờ, ngăn chặn các cảnh báo. Hãy xem http://stackoverflow.com/questions/593996/how-to-suppress-java-compiler-warnings-for-specific-functions. Vấn đề là trình biên dịch xem xét 'ActionEvent.getSource' và nói" Tôi có một đối tượng và trong khi về lý thuyết, bạn có thể truyền cho tôi, những gì bạn đang cố gắng truyền cho tôi có thể không hoạt động " – MadProgrammer

+0

Tôi hiểu rằng bạn có thể chặn cảnh báo, nhưng điều đó ít hơn lý tưởng đối với tôi. Nếu tôi đã làm điều đó cho tất cả các cảnh báo trình biên dịch, chúng ta hãy chỉ nói rằng nó sẽ không được tốt. Nó luôn luôn là tốt hơn để tìm hiểu lý do tại sao và đúng cách giải quyết nó nếu có thể. –

Trả lời

4

Tôi đề xuất phương pháp này. Nó tránh mọi Typecasts và dễ đọc.

Tôi đã cải thiện câu trả lời của mình, hiện tại Nó không cung cấp cho bạn Cảnh báo biên dịch. Loại JComboBox hiện được đặt thành Chuỗi. Để có được mục đã chọn, bạn phải đi qua ComboBoxModel.

class CustomerActionListener implements ActionListener 
{ 
    private JComboBox<String> comboBox; 
    public CustomerActionListener(JComboBox<String> comboBox){ 
    this.comboBox = comboBox; 
    } 
    @Override 
    public void actionPerformed(ActionEvent event) 
    { 
    // Just use the comboBox 
    ComboBoxModel<String> model = comboBox.getModel(); 
    int index = comboBox.getSelectedIndex(); 
    String choosen = model.getElementAt(index); 
    System.out.println("Hey you choose "+choosen); 
    } 
} 
+1

Và làm thế nào điều này sẽ giúp đỡ để thoát khỏi * JComboBox là một loại thô. Tham chiếu đến loại JComboBox chung nên được tham số * cảnh báo. Mã của bạn có chính xác cùng một vấn đề – Robin

+1

Cố gắng biên dịch mã đó với JDK7 -> Bạn vẫn có cảnh báo trình biên dịch! Câu trả lời của bạn không giải quyết được vấn đề khi nó đứng. –

+0

Cảm ơn Robin và Guillaume. Đã thực hiện một số thay đổi. Đầu tiên tôi quên đặt kiểu trên JComboBox. Tiếp theo, tôi nghĩ rằng một JComboBox đã gõ có thể trả về một typed Result được đánh máy dễ dàng hơn bằng cách chỉ cần gọi phương thức getSelectedItem(). Nhưng nó không thể. Bây giờ nó sẽ hoạt động tốt. Im không nhận được bất kỳ compilerwarnings. – daniel

0

Hãy thử để kiểm tra này:

A very useful link form StackOverflow

Trong vài từ, trình biên dịch Java không biết những gì đối tượng là một trong những bạn đang cố gắng đúc, vì vậy nó không muốn làm diễn viên mà không cần một từ, nó phải tư vấn cho bạn rằng bạn có thể đang phạm sai lầm (nhưng bạn KHÔNG biết loại Lớp nào là đối tượng bạn đang đúc, vì vậy đừng bận tâm về nó) Thêm @SuppressWarning ("unchecked")

+0

@stephane (được viết bởi Meriton). Vì vậy, bạn không cần phải thêm cảnh báo ngăn chặn;) Bạn có thể viết: Lớp > c = ClientAction.class; Hành động action = c.newInstance(); Điều này loại bỏ cả diễn viên và cảnh báo, với mức giá giới thiệu một loại không chung chung để bạn có thể sử dụng .class để có được một đối tượng Lớp được nhập chính xác đầy đủ. – Gianmarco

0

Cách duy nhất ra ở đây là để lấy một tài liệu tham khảo gõ để bạn JComboBox:

Hoặc như thế này

JComboBox<String> myStringCb = new JComboBox<String>(); 
... 
myStringCb.addActionListener(new CustomerActionListener(myStringCb); 

và với bạn ActionListener:

class CustomerActionListener implements ActionListener { 

    private JComboBox<String> cb; 

    public CustomerActionListener(JComboBox<String> cb) { 
    this.cb = cb; 
    } 

    @Override 
    public void actionPerformed(ActionEvent event) { 
    if(event.getSource()==cb) { 
     // Here you can do something with the typed cb 
    } 
    } 
} 

Hoặc, giải pháp khác là sử dụng một số vô danh ActionListener với số final tham chiếu:

final JComboBox<String> myStringCb = new JComboBox<String>(); 
myStringCb.addActionListener(new ActionListener(){ 

    public void actionPerformed(ActionEvent e) { 
     // Here you can refer directly to myStringCb 
    } 

}); 
+0

ehh ... đó là khá mâu thuẫn với ý tưởng cơ bản của một hành động (đó là một-nhiều :-) – kleopatra

+0

@ kleopatra Không có gì ngăn cản bạn làm điều này một-nhiều. Trong ví dụ này, tôi đã tiếp xúc với khái niệm cơ bản và mối quan hệ một-một. Nhưng như bạn đã chỉ ra trong một bài đăng khác, việc nhập phần tử giao diện người dùng là vô nghĩa. Nó không nên đi xa hơn mô hình. –

+1

_Không có gì ngăn cản bạn thực hiện việc này với nhiều người._ Không có gì ngoại trừ ... giữ một danh sách các mục tiêu? Tôi không nghĩ rằng đó là một lựa chọn khả thi, cuối cùng chúng tôi ít nhất là đồng ý về loại vô nghĩa của generics trong lĩnh vực xem :-) – kleopatra

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