2014-09-15 46 views
9

Khi sử dụnggetContentPane() làm gì chính xác?

Container c = getContentpane(); 

& khi sử dụng

frame.getcontentpane(); 
+2

Huh? Bạn có thể đưa ra một ví dụ cho mỗi người không? API đã cho bạn biết điều gì? –

+0

chương trình sách giáo khoa của tôi chỉ sử dụng frame.getcontentpane .. nhưng trong khi thực sự triển khai nó thì nó không hoạt động. Tôi phải sử dụng con = getcontentpane() .. u sẽ cho tôi biết cơ chế của getcontentpane .. nó có thể rõ ràng tất cả các nghi ngờ của tôi. –

+0

Bạn có thể đăng một số mã của mình không? Lớp bạn đang gọi getContentPane() từ trong ví dụ đầu tiên có mở rộng JFrame không? – mdewitt

Trả lời

9

Nếu mã là một phần của lớp con JFrame, bạn nên sử dụng getContentPane(). Nếu mã không phải là một phần của khung (có lẽ bạn đang ở trong phương thức static main() cho ứng dụng), thì bạn cần sử dụng đối tượng JFrame để gọi getContentPane(); đó là những gì frame.getContentPane() làm.

Ví dụ:

public class TestApp extends JFrame { 
    public static void main(String[] args) { 
     TestApp frame = new TestApp(); 
     Container c = frame.getContentPane(); 
     // do something with c 
     frame.pack(); 
     frame.show(); 
    } 

    /* constructor */ 
    public TestApp() { 
     Container c = getContentPane(); // same as this.getContentPane() 
     // initialize contents of frame 
    } 
} 
+0

khung này tôi đang nói về không phải là var của lớp người dùng .. của lớp JFrame –

+0

@ChinmayKale - Vâng, tôi nên nhận ra điều đó. 'getContentPane()' là một phương thức Swing. Tôi nghĩ bạn có ý tưởng cơ bản. –

+0

Vì vậy, chúng ta có thể thực hiện cùng gui với lớp Chỉ chứa Container hoặc lớp Chỉ lớp Jframe? nó không quan trọng? –

1

Vâng, tôi could direct to the api:

Trả về đối tượng ContentPane cho khung này.

It's all part of the gui initialization process. giao thức Java thực sự, phải thừa nhận là một số soạn sẵn để có được giao diện đồ họa của bạn lên:

public class FlowLayoutExample extends JApplet { 

    public void init() { 
    getContentPane().setLayout(new FlowLayout()); 
    getContentPane().add(new JButton("One")); 
    getContentPane().add(new JButton("Two")); 
    getContentPane().add(new JButton("Three")); 
    getContentPane().add(new JButton("Four")); 
    getContentPane().add(new JButton("Five")); 
    getContentPane().add(new JButton("Six")); 
    } 
} 

-Source

Nhưng về cơ bản, chúng tôi đang thu thập các lớp cửa sổ nội dung như vậy mà sau này bạn có thể thêm một đối tượng với nó. See this for more details.

1

có khả năng bạn đang mở rộng JFrame có nghĩa là lớp sẽ kế thừa các phương pháp từ JFrame. Như vậy, mã của bạn có thể trông hơi giống như sau:

public class MyClass extends JFrame { 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       try { 
        new MyClass(); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 

    public MyClass() { 
     ... 
     Container c = getContentPane(); 
    } 
} 

Trong ví dụ trên, không có nhu cầu sử dụng frame.getContentPane() bởi vì bạn đang kế thừa những phương pháp JFrame. Nói cách khác, bạn chỉ cần viết getContentPane(). Ngoài ra, trong hầu hết trường hợp, bạn thực sự cần được instantiating mới JFrame như là một biến Ví dụ nếu bạn đang thực sự thêm chức năng mới cho lớp JFrame:

public class MyClass { 
    private JFrame frame; 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       try { 
        new MyClass(); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 

    public MyClass() { 
     ... 
     Container c = frame.getContentPane(); 
    } 
} 
0

Nếu bạn chúng tôi mở rộng JFrame sau đó chúng ta có thể sử dụng getContentPane() phương pháp trực tiếp trong đối tượng BoxLayout của chúng tôi. Nhưng nếu chúng ta áp dụng quy tắc kết hợp (nghĩa là chúng ta tạo đối tượng JFrame trong mã của chúng tôi tức là JFrame f=new JFrame()), thì chúng ta cần phải tạo đối tượng vùng chứa và chuyển đối tượng này trong BoxLayout() làm đối số.

  1. Khi chúng ta mở rộng JFrame:

    public class BoxLayOutTest extends JFrame { 
        public BoxLayOutTest() { 
         // TODO Auto-generated constructor stub 
         setSize(300, 400); 
         setVisible(true); 
         getContentPane().setLayout(new BoxLayout(getContentPane(), BoxLayout.X_AXIS)); 
         JButton b1 = new JButton("One"); 
         JButton b2 = new JButton("Two"); 
         JButton b3 = new JButton("Three"); 
         JButton b4 = new JButton("Four"); 
         JButton b5 = new JButton("Five"); 
    
         add(b1); 
         add(b2); 
         add(b3); 
         add(b4); 
         add(b5); 
        } 
    
        public static void main(String[] args) { 
         new BoxLayOutTest(); 
        } 
    } 
    
  2. Nếu chúng ta tạo JFrame Object bên trong mã:

    public class TwoPanelinFrame { 
        JFrame f; 
    
        public TwoPanelinFrame() { 
         f = new JFrame("Panel Test"); 
         f.setSize(600, 600); 
         f.setVisible(true); 
         Container c = f.getContentPane(); 
         f.getContentPane().setLayout(new BoxLayout(c, BoxLayout.X_AXIS)); 
    
         JButton b2 = new JButton("One"); 
         JButton b3 = new JButton("One"); 
         JButton b4 = new JButton("One"); 
         JButton b5 = new JButton("One"); 
    
         f.add(b2); 
         f.add(b3); 
         f.add(b4); 
         f.add(b4); 
        } 
    
        public static void main(String[] args) { 
         new TwoPanelinFrame(); 
        } 
    } 
    
4
getContentPane().setBackground(Color.YELLOW); 

Dòng mã này khó hiểu, và người dạy kèm sẽ đặt nền móng cho bạn để hiểu nó đầy đủ khi bạn tiếp tục học Java. Đầu tiên cần xem xét là quy tắc về sửa đổi đối tượng với phương thức . Ở phía bên trái của một giai đoạn là một đối tượngphương pháp mà sửa đổi đối tượng là ở phía bên phải của giai đoạn . Quy tắc đó áp dụng ở đây.

A chứa có một số lớp trong đó. Bạn có thể coi lớp là một lớp trong suốt phủ lên vùng chứa. Trong Java Swing, lớp được sử dụng để giữ các đối tượng được gọi là ngăn nội dung . Các đối tượng được thêm vào lớp khung nội dung của vùng chứa. Phương thức getContentPane() truy xuất lớp khung nội dung để bạn có thể thêm đối tượng vào đó. Ô nội dung là một đối tượng được tạo bởi môi trường thời gian chạy Java. Bạn không cần phải biết tên của khung nội dung để sử dụng nó. Khi bạn sử dụng getContentPane(), đối tượng khung nội dung sau đó được thay thế ở đó để bạn có thể áp dụng một phương thức cho nó. Trong dòng mã này, chúng tôi không thêm đối tượng vào ngăn nội dung. Thay vào đó, chúng tôi đang làm cho màu của khung nội dung trở thành màu vàng. Dòng mã này là những gì thay đổi màu mặc định, trắng, thành vàng và bạn có thể nhớ lại thấy hình chữ nhật màu vàng trong ví dụ chương trình đang chạy trong trình duyệt. Dòng mã này là những gì làm cho khu vực hình chữ nhật màu vàng.

Một cách để suy nghĩ về vấn đề này là để suy nghĩ rằng đối tượng cửa sổ nội dung được thay thế cho phương pháp getContentPane(), như thế này:

contentpaneobject.setBackground(Color.YELLOW); 

Mặc dù bạn không bao giờ thực sự nhìn thấy trên tuyên bố, bạn có chức năng của câu lệnh . Khi bạn lấy khung nội dung với getContentPane()phương pháp, sau đó bạn có thể thay đổi nội dung cửa sổ đối tượng, được tùy tiện đặt tên contentpaneobject trong ví dụ trên. Trong tuyên bố này, sửa đổi là thay đổi màu của khung nội dung. Bước đó được trình bày tiếp theo trong gia sư.

Lưu ý hình thức getContentPane() làm phương thức . Phương thức bắt đầu bằng một chữ thường và nó có dấu ngoặc đơn. Các dấu ngoặc đơn trống.

enter image description here

enter image description here