2012-07-11 31 views
16

Cách tốt nhất để triển khai giao diện java.awt.event.ActionListener là gì?Lớp của bạn có nên triển khai ActionListener hoặc sử dụng đối tượng của lớp ActionListener ẩn danh

Có lớp học của bạn thực hiện ActionListener và thêm này như là một ActionListener:

class Foo implements ActionListener{ 

    public Foo() { 
     JButton button = new JButton(); 
     button.addActionListener(this); 
    } 

    public void actionPerformed(ActionEvent e) { 

    } 
} 

Hoặc thêm một đối tượng của một lớp ActionListener nặc danh:

class Foo{ 

    public Foo() { 
     JButton button = new JButton(); 
     button.addActionListener(new ActionListener() {  
      public void actionPerformed(ActionEvent e) { 

      } 
     }); 
    } 
} 

Trả lời

30

Một số (Jeanette/Kleopatra) nói với gần như không bao giờ sử dụng ActionListener và thay vào đó, hãy sử dụng Hành động như AbstractAction. Nó hầu như luôn là một lý tưởng tồi để lớp GUI của bạn thực hiện các trình lắng nghe của bạn mặc dù điều này phá vỡ các Single Responsibility Principle và làm cho mã của bạn khó khăn hơn để duy trì và mở rộng, và vì vậy tôi khuyên bạn không nên làm điều đó.

Vì vậy, ví dụ, một lớp bên trong cho việc này:

import java.awt.event.ActionEvent; 
import java.awt.event.KeyEvent; 
import javax.swing.AbstractAction; 
import javax.swing.JButton; 

class Foo { 

    public Foo() { 
     JButton button = new JButton(new ButtonAction("Action", KeyEvent.VK_A)); 
    } 

    private class ButtonAction extends AbstractAction { 
     public ButtonAction(String name, Integer mnemonic) { 
     super(name); 
     putValue(MNEMONIC_KEY, mnemonic); 
     } 

     @Override 
     public void actionPerformed(ActionEvent e) { 
     System.out.println("button pressed"); 
     } 
    } 

} 
+0

+1 - AbstractAction –

+0

+1 Đối với 'AbstractAction' và [' Nguyên tắc trách nhiệm duy nhất'] (http://en.wikipedia.org/wiki/Single_responsibility_principle). –

+1

Đẹp, nhưng có vẻ phức tạp hơn (trong việc duy trì mã) và khó đọc hơn. Hay tôi nhầm? – elias

4

Nó phụ thuộc. Nếu bạn muốn sử dụng lại các ActionListener trên nhiều thành phần, tùy chọn một là tốt hơn. Nếu ActionListener sẽ chỉ bao giờ được liên kết với một nút, tùy chọn hai là tốt.

Nói chung, bạn sẽ tạo một lớp riêng biệt (hoặc lớp bên trong), nếu bạn dự đoán một số tăng trưởng trong dự án. Không cần Foo để triển khai ActionListener.

+2

Có một lớp gui thực hiện ActionListener chỉ dành cho các chương trình đồ chơi. Vì anh ấy hỏi về "các phương pháp hay nhất" nên không sử dụng điều này trong bất kỳ trường hợp nào. –

8

Tùy chọn thứ hai (lớp ẩn danh) chắc chắn tốt hơn, một tùy chọn khác là có một lớp lồng nhau trong phạm vi Foo.

Tôi sẽ không đi với các tùy chọn đầu tiên vì hai lý do:

  • Người sử dụng của Foo không cần phải biết rằng nó thực hiện ActionListener.
  • Bạn không thể triển khai hai trình nghe khác nhau trong cùng một lớp.
+0

Tôi sẽ upvote câu trả lời này vì lý do đầu tiên, nhưng lý do thứ hai chỉ là sai lầm. Bạn có thể kiểm tra nguồn của 'ActionEvent' và quyết định đường dẫn mã mà bạn nên thực hiện.Cho dù đó là một giải pháp thanh lịch là một cuộc thảo luận, nhưng nó chắc chắn có thể – Robin

+4

@Robin: Bạn nói đúng nhưng đó không phải là quan điểm của tôi. Ý tôi là người ta sẽ không thể thực hiện 'ActionListener' hai lần trong cùng một lớp. – casablanca