2009-02-24 30 views
5

Giả sử tôi có điều này:Calling này từ bên trong một lồng Java ActionListener

class external { 
    JFrame myFrame; 
    ... 

    class internal implements ActionListener { 
     public void actionPerformed(ActionEvent e) { 
      ... 
      myFrame.setContentPane(this.createContentPane()); 
     } 
    } 
    ... 
} 

createContentPane trả về một container. Bây giờ, nếu tôi đã làm mã này bên ngoài của ActionListener nó sẽ làm việc, bởi vì tôi muốn có quyền truy cập này. Nhưng, bên trong nó, tôi không. Tôi có quyền truy cập vào myFrame, đó là những gì sẽ được cập nhật với nội dung của phương pháp, nhưng đó là không đủ để làm những gì tôi muốn, trừ khi tôi có thể nhận được một điều này ra khỏi nó.

Tôi cũng cần thông tin từ các biến mẫu khác để sử dụng createContentPane(), vì vậy tôi không chắc chắn mình có thể làm cho nó static.

Trả lời

9

Bạn có thể:

myFrame.setContentPane(createContentPane()); 

hoặc

myFrame.setContentPane(external.this.createContentPane()); 

Vào cách, trong các lớp Java chữ cái đầu tiên thường là chữ hoa. Mã của bạn sẽ vẫn biên dịch và chạy nếu bạn không đặt tên như vậy, nhưng bằng cách làm theo các quy ước mã hóa, bạn sẽ có thể đọc mã khác, và nhiều điều quan trọng khác sẽ có thể đọc được mã của bạn.

Vì vậy, đây sẽ là một phong cách tốt hơn:

class External { 
    JFrame myFrame; 
    ... 

     class Internal implements ActionListener { 
      public void actionPerformed(ActionEvent e) { 
       ... 
       myFrame.setContentPane(createContentPane()); 
       //Or myFrame.setContentPane(External.this.createContentPane()); 
      } 
     } 
    ... 
} 

Java Code conventions

+0

Rất vui khi tôi tìm thấy điều này, chỉ là những gì tôi cần (trong lần thứ 400). Tôi rất thích điều chỉnh câu hỏi và câu trả lời này để không đề cập đến chữ hoa, vì nó chỉ gây nhầm lẫn và không liên quan ... nhưng tôi sẽ không. Cảm ơn +1 –

1

Không chắc chắn chính xác những gì bạn đang nhận được, nhưng một lớp bên trong có quyền truy cập vào tất cả các thành viên của lớp kèm theo của nó. Để truy cập con trỏ "này" của lớp bao quanh (ví dụ: để chuyển sang các phương pháp khác), hãy sử dụng:

someMethod(External.this); 

Trong ví dụ của bạn, bạn đang thực sự làm phức tạp bằng cách sử dụng "cái này". Dưới đây là hai lựa chọn mà sẽ làm việc:

myFrame.setContentPane(createContentPane()); 

hay:

myFrame.setContentPane(External.this.createContentPane()); 

Lưu ý rằng bạn đã truy cập vào myFrame theo cách tương tự.

+0

argh này, đánh bại tôi bằng cách 8 giây; -) +1 –

+0

chúng là điểm ngắt :) cảm ơn. –

2

external.this sẽ cung cấp cho bạn truy cập vào các thể hiện của lớp kèm theo, nếu đó là những gì bạn muốn ...

0

Trước tiên, bạn cần phải mở rộng JFrame trong lớp bên ngoài của bạn như

class External extends JFrame { 
..... 
..... 
} 
Các vấn đề liên quan