2010-02-14 33 views
5

Tôi đã sử dụng một lớp bên trong anon để có được một nút obj:lớp bên trong vô danh cho các nút

Button modButton = new Button("Modify"); 
modButton.addClickHandler(new ClickHandler() { 
    @Override 
    public void onClick(ClickEvent event) { 
     //TODO: link to a pop-up, and do a refresh on exit 
    } 
}); 

Tôi muốn sử dụng này trong một cách tùy tiện có kích thước GWT FlexTable (mà về cơ bản là một ô tô bảng định cỡ lại).

nếu tôi làm điều gì đó như thế này:

currentTable.setText(3, 0, "elec3"); 
currentTable.setWidget(3, 2, modButton); 

currentTable.setText(4, 0, "elec4"); 
currentTable.setWidget(4, 2, modButton); 

Nút chỉ xuất hiện cho một thứ hai (vì chỉ có một ví dụ). Kể từ khi bảng trên sẽ được dân cư theo chương trình, nó không thực sự thực tế để xác định một nút mới cho mỗi trường hợp có thể.

Tôi cố gắng này như sau:

currentTable.setText(4, 0, "elec4"); 
currentTable.setWidget(4, 2, new Button("Modify"); 
modButton.addClickHandler(new ClickHandler() { 
    @Override 
    public void onClick(ClickEvent event) { 
     //TODO: link to a pop-up, and do a refresh on exit 
    } 
}); 
); 

Tuy nhiên, điều này sẽ không biên dịch tại tất cả (người đầu tiên, tôi đoán), tôi một chút mất - làm thế nào tôi có thể đạt được hiệu ứng này?

Cảm ơn

+1

Tôi tin đoạn mã cuối cùng sẽ biên dịch nếu bạn xóa ') lần cuối'); ' – MatrixFrog

Trả lời

1

Cú pháp của bạn không chính xác trong ví dụ thứ ba, nhưng trong mọi trường hợp, việc sử dụng lớp ẩn danh trong trường hợp đó là không thể. Bạn đang cố gắng gọi addClickHandler trên đối tượng mới được khởi tạo, không được lưu trữ trong bất kỳ biến nào. Về mặt lý thuyết, bạn có thể đặt mã đó trong một hàm tạo cho lớp ẩn danh của bạn và gọi hàm đó trên "this". Vấn đề là, bởi vì các đặc thù của cú pháp lớp ẩn danh của Java (hoàn toàn tàn nhẫn), nên không thể định nghĩa một hàm tạo (nó sẽ được gọi là gì?).

Tôi không chắc chắn 100% tôi hiểu những gì bạn đang cố gắng hoàn thành, nhưng bạn có thể xác định một chức năng vừa trả về một thể hiện nút mới được cấu hình chính xác mỗi khi bạn gọi nó? Ví dụ,

private Button newModButton() { 
    Button modButton = new Button("Modify"); 
    modButton.addClickHandler(new ClickHandler() { 
     @Override 
     public void onClick(ClickEvent event) { 
      //TODO: link to a pop-up, and do a refresh on exit 
     } 
    }); 
    return modButton; 
} 

Sau đó, bạn sẽ gọi

currentTable.setWidget(4, 2, newModButton()); 
+2

+1 Hoặc có thể mở rộng' Nút' và thực hiện 'ClickHandler'. – trashgod

+0

cảm ơn! những công việc này. trashgod, không chắc chắn tôi hoàn toàn làm theo - bạn có nghĩa là tôi nên xác định một lớp học và chỉ cần tạo (anon?) trường hợp của nó, trong setWidget? – malangi

+0

Không, tôi nghĩ anh ấy có nghĩa là tạo một lớp mới (có thể là riêng tư, gói/mặc định, bên trong - phụ thuộc vào phạm vi bạn muốn sử dụng nó) như sau: 'MyButton extends Button thực hiện ClickHandler' và sau đó triển khai và thiết lập 'ClickHandler' giống như trong câu trả lời của tôi - sự khác biệt lớn là bạn không thực sự cần mở rộng' Nút' (và nó thực sự chán nản) - vì bạn không giới thiệu bất kỳ hành vi tùy chỉnh nào khác, bạn chỉ muốn vượt qua một điểm chung 'ClickHandler' đến nhiều' Button '. –

0

Cách hiệu quả nhất (cả hai từ quan điểm của GWT và số lượng mã) là dành cho lớp học của bạn để thực hiện ClickHandler và sau đó cho mỗi hàng tạo một mớiButton (bạn không thể thêm cùng một Widget hai lần để DOM):

class Foo extends Composite implements ClickHandler { 

    public Foo() { 
     FlexTable currentTable = new FlexTable(); 

     Button button = new Button("Button1"); 
     // Add this class as the ClickHandler 
     button.addClickHandler(this); 
     currentTable.setText(3, 0, "elec3"); 
     currentTable.setWidget(3, 2, button); 

     button = new Button("Button2"); 
     // Add this class as the ClickHandler 
     button.addClickHandler(this); 
     currentTable.setText(4, 0, "elec4"); 
     currentTable.setWidget(4, 2, modButton); 
    } 


    public void onClick(ClickEvent event) { 
     //TODO: link to a pop-up, and do a refresh on exit 
    } 

} 

Lưu ý những gì chúng tôi đang làm ở đây - không có lớp ẩn danh, chúng tôi triển khai giao diện ClickHandler một lần. Điều này hiệu quả hơn việc tạo lớp ẩn danh cho mỗi nút (khi bạn muốn tất cả các nút hoạt động theo cùng một cách), bởi vì nếu không GWT sẽ phải tạo mã bổ sung cho mỗi nút bạn thêm - thay vào đó, ClickHandler được triển khai ở một nơi và được tham chiếu bởi tất cả các nút.

PS: Có lẽ bạn nên xem xét sử dụng IDE như Eclipse (với Google Plugin for Eclipse) - nó làm cho việc phát triển GWT trở nên dễ dàng và sẽ gặp lỗi cú pháp như lỗi trong đoạn mã cuối cùng của bạn.

+0

Cảm ơn điều này - tôi đoán nhật thực trông giống như con đường phía trước. Tôi muốn sử dụng các nút này trong một vòng lặp, vì vậy tôi đoán xác định chúng không thực sự có vẻ thực tế, nhưng tôi thấy quan điểm của bạn về clickhandler, điều này sẽ làm cho mã sạch hơn nhiều. Cảm ơn! – malangi

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