2011-12-28 42 views
10

Tôi vừa viết một đoạn mã đơn giản nơi tôi muốn một textfield và một nút xuất hiện trên khung chính, nhưng sau khi chạy tất cả những gì tôi thấy là textfield.Java Swing Bố cục JFrame

Nếu tôi viết mã của nút sau trường văn bản thì chỉ nút được hiển thị.

Bất kỳ ý tưởng nào tại sao?

JFrame mainframe=new JFrame(); 
    mainframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    mainframe.setBounds(0,0,200,200); 
    JButton jb=new JButton(); 
    jb.setText("Leech"); 
    mainframe.add(jb); 
    JTextField link=new JTextField(50); 
    mainframe.add(link); 
    mainframe.pack(); 
    mainframe.setVisible(true); 
+0

Lớp javadoc rõ ràng nói rằng bạn có thể gọi thêm cũng như sẽ thêm nó vào ngăn nội dung. Ít nhất trong các phiên bản Java gần đây hơn thì tài liệu 1.3 mà bạn tham chiếu – Robin

Trả lời

5

Thêm thành phần của bạn vào JPanel và sau đó thêm bảng đó vào contentpane của JFrame.

  
     JFrame window = new JFrame(); 
     JPanel mainframe=new JPanel(); 
     window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     window.setBounds(0,0,200,200); 
     JButton jb=new JButton(); 
     jb.setText("Leech"); 
     mainframe.add(jb); 
     JTextField link=new JTextField(50); 
     mainframe.add(link); 
     window.getContentPane().add(mainframe); 
     window.pack(); 
     window.setVisible(true);
+3

về cơ bản giống như thiết lập 'FlowLayout' là' LayoutManager' trên 'JFrame', vì đó là biểu mẫu bố trí mặc định là 'JPanel' – Robin

+1

Không thể tin đây là câu trả lời được chấp nhận. Câu trả lời của Robin dưới đây là câu trả lời đúng. Chỉ cần hiểu người quản lý bố cục mặc định của JFrame là gì và vị trí mặc định nào đó được thêm vào trong BorderLayout nếu không được chỉ định. – Michael

+0

@Michael điểm của nhận xét của bạn là gì? Bạn có nghĩ rằng câu trả lời này là sai hoặc bạn không thích cách nó được mã hóa theo cách đó? – Ibrahim

9

Thay vì thêm trực tiếp các thành phần vào JFrame, hãy sử dụng JPanel làm vùng chứa với mong muốn LayoutManager.

Here bạn có thể tìm thấy một số hướng dẫn về trình quản lý bố cục.

Về cơ bản trong Swing LayoutManager có trách nhiệm bố trí các thành phần con (thiết lập vị trí và kích thước của chúng), vì vậy mọi thành phần vùng chứa bạn sử dụng bên trong ứng dụng cần được cấu hình với LayoutManager thích hợp.

+0

Liên kết trên LayoutManager hiện đã chết. Hãy sửa chữa. – Ungeheuer

11

Bố cục mặc định trên JFrameBorderLayout. Gọi phương thức add trên Container với bố cục như vậy tương đương với cuộc gọi add(..., BorderLayout.CENTER). Mỗi vị trí của BorderLayout chỉ có thể chứa một phần tử. Do đó, thực hiện hai cuộc gọi

mainframe.add(jb); 
mainframe.add(link); 

kết quả trong TRUNG TÂM chứa thành phần cuối cùng bạn đã thêm. Nếu bạn muốn tránh điều này, bạn có thể thêm nó vào các vị trí khác nhau hoặc sử dụng một trình quản lý bố cục khác (ví dụ: FlowLayout) bằng cách gọi JFrame#setLayout

0

Trình quản lý bố cục mặc định của JFrame là BorderLayout. Nếu bạn muốn bố trí tự động, bạn có thể sử dụng FlowLayout:

mainframe.setLayout(new FlowLayout()); 

Nếu bạn muốn xác định tọa độ của setBounds() phương pháp, bạn phải hủy bỏ các thiết lập của người quản lý bố trí trên JFrame:

mainframe.setLayout(null); 
jb.setBounds(10,10,100,50); 
link.setBounds(10,70,180,100); 
+0

Bạn không bao giờ nên đặt bố cục thành null, điều đó chỉ đơn giản là sai. – Michael

0

nếu bạn thấy tài liệu BorderLayout mainframe.add (jb); bằng với mainframe.add (jb, BorderLayout.CENTER); mainframe.add (liên kết); bằng với mainframe.add (jb, BorderLayout.CENTER);

để chỉ hiển thị hình ảnh cuối cùng

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