2013-03-02 53 views
8

Tôi không thể thêm JTextField vào JFrame. My JFrame chứa JLabelJTextField. Đầu tiên, tôi đã thêm JLabel và nó đang hoạt động. Đây là mã.Không thể thêm JTextField vào JFrame

private static void createandshowGUI() 
    { 

    JFrame frame =new JFrame("HelloSwing"); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.getContentPane().setBackground(Color.red); 
    frame.setSize(200,200); 

    JLabel label=new JLabel("New To Java!!"); 
    frame.getContentPane().add(label); 
    frame.setVisible(true); 
} 
public static void main(String[] args) { 
    createandshowGUI();} //and it shows the output like below . 

Frame having JLabel

Sau đó, tôi đã thêm JTextField.

JLabel label=new JLabel("New To Java!!"); 
    frame.getContentPane().add(label); 

    JTextField jtf=new JTextField(); 
    frame.getContentPane().add(jtf); 

    frame.setVisible(true); 

Nhưng sau đó nó hiển thị kết quả như thế này.

Frame having JLabel and JTextField

Hãy ai đó giúp tôi về issue.Can này tôi thêm nhiều hơn một thành phần để JFrame? Như tôi mới đến Java, tôi đang có một sự nhầm lẫn giữa khung hình, ContentPane và Layouts.

+4

+1 cho câu hỏi có cấu trúc xuất sắc. – christopher

Trả lời

8

Thực ra bạn đã thành công khi thêm JTextField. Vấn đề bạn đang gặp phải xuất phát từ trình quản lý bố cục trải dài trên toàn bộ khung.

Ngăn nội dung của JFrame sử dụng trình quản lý BorderLayout theo mặc định. (Xem How to Use BorderLayout)

Trong ứng dụng của tôi luôn luôn kết thúc bằng cách sử dụng trình quản lý MigLayout, nhưng trước tiên bạn có thể muốn tự làm quen với người quản lý bố cục nói chung. (Xem A Visual Guide to Layout Managers)

+0

+1 cho MigLayout - Tôi cũng kết thúc bằng cách sử dụng điều này khi tôi tìm bố cục – exexzian

3

ContentPane của bạn có mặc định là BorderLayout, chỉ chấp nhận một phần tử duy nhất (ở vị trí mặc định - giữa). Sau khi bạn thêm phần tử thứ hai (số JTextField), nó thay thế phần tử thứ hai (số JLabel).

Khi bạn thêm các phần tử vào một số Container bằng đối số add, bạn không chỉ định vị trí nào bạn muốn, vì vậy trình quản lý bố cục chọn vị trí theo ý muốn. OTOH nếu bạn chỉ định các ràng buộc (sử dụng overloaded add) thì bạn có quyền kiểm soát nhiều hơn đối với vị trí đặt phần tử. Kiểm tra tài liệu cho từng trình quản lý bố cục để xem cách chúng hoạt động và những hạn chế nào mà nó hỗ trợ.

Đối với tình hình hiện tại của bạn, bạn có thể sử dụng một trung gian JPanel (trong đó có FlowLayout như mặc định của nó LayoutManager - các IMHO đơn giản nhất cho những người vẫn đang học) thay vì thêm các yếu tố trực tiếp đến cửa sổ nội dung, hoặc đơn giản là thay đổi cách bố trí của mình cho một cái gì đó khác.

+0

Câu trả lời hay, nhưng hơi phức tạp đối với một người mới. Vẫn +1 –

-1

A JFrame chỉ có thể có một thành phần (trừ khi bạn đang sử dụng nó có BorderLayout). Giải pháp là sử dụng JPanel. Bạn thêm các đối tượng vào JPanel và sau đó thêm JPanel vào JFrame. Bạn cũng cần thêm import javax.swing.JPanel;. Bạn có thể làm điều gì đó như sau:

private static void createandshowGUI() 
{ 
    JFrame frame =new JFrame("HelloSwing"); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.getContentPane().setBackground(Color.red); 
    frame.setSize(200,200); 

    JPanel panel = new JPanel(); //Create a JPanel 

    JLabel label=new JLabel("New To Java!!"); 
    panel.add(label); // Add the label to the panel 

    JTextField jtf = new JTextField(); 
    panel.add(jtf); // Add the JTextField to the panel 

    frame.getContentPane().add(panel); // Add the panel to the JFrame 
    frame.setVisible(true); 
} 
public static void main(String[] args) { 
    createandshowGUI();} 

Điều này sẽ hiệu quả.

+0

Cảm ơn bạn .. Bảng điều khiển đã hoạt động .. – Sam

+0

@Sam Nhưng câu trả lời của Daniel Rikowski hữu ích hơn? ;-) –

+1

Có. Tất nhiên. Đó là lý do tại sao tôi chấp nhận câu trả lời đó. Nhưng có một số vấn đề trong Layout Layout, mà tôi sắp hỏi. Và Hội đồng đã cho tôi kết quả ngay lập tức. :) Cảm ơn bạn. – Sam

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