2013-03-02 21 views
8

Ich kann JTextField nicht zu JFrame hinzufügen. Meine JFrame enthält eine JLabel und eine JTextField. Zuerst habe ich die JLabel hinzugefügt, und es funktioniert. Hier ist der Code.Kann JTextField nicht zu JFrame hinzufügen

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

Dann habe ich JTextField.

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

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

    frame.setVisible(true); 

Aber dann zeigt es Ausgabe wie folgt.

Frame having JLabel and JTextField

Bitte jemand mir helfen, auf diesem issue.Can i mehr als eine Komponente zu JFrame hinzufügen? Wie ich zu Java bin hier, ich bin eine Verwirrung zwischen Rahmen, ContentPane und Layout.

+4

+1 für hervorragend strukturierte Frage. – christopher

Antwort

8

Tatsächlich sind Sie erfolgreich beim Hinzufügen der JTextField. Das Problem, auf das Sie stoßen, stammt vom Layout-Manager, der sich über den gesamten Frame erstreckt.

Der Inhaltsbereich von JFrame verwendet standardmäßig einen Manager BorderLayout. (Siehe How to Use BorderLayout)

In meiner Anwendung endete eine immer mit dem MigLayout Manager, aber zuerst möchten Sie sich vielleicht mit Layout-Managern im Allgemeinen vertraut machen. (Siehe A Visual Guide to Layout Managers)

+0

+1 für MigLayout - Ich benutze auch dies, wenn ich nach Layouts suche – exexzian

3

Ihre ContentPane hat standardmäßig eine BorderLayout, die nur ein einzelnes Element akzeptiert (in der Standardposition - der Mitte). Nachdem Sie ein zweites Element hinzugefügt haben (das JTextField), ersetzte es das letzte (das JLabel).

Wenn Sie Elemente zu einem Container mit dem einfachen Argument add hinzufügen, geben Sie nicht an, in welcher Position Sie sie haben möchten, sodass der Layout-Manager eine Position nach Belieben auswählt. OTOH, wenn Sie Einschränkungen angeben (mit der overloaded add), dann haben Sie mehr Kontrolle darüber, wo das Element platziert wird. Überprüfen Sie die Dokumente für jeden Layout-Manager, um zu sehen, wie sie funktionieren und welche Einschränkungen sie unterstützt.

Für Ihre aktuelle Situation, können Sie einen Zwischen verwenden JPanel (die FlowLayout als Standard hat LayoutManager - einfachsten IMHO für das lernt noch) statt Elemente der Zugabe direkt mit dem Inhaltsfenster oder einfach das Layout etwas ändern sonst.

+0

Gute Antwort, aber ein bisschen zu kompliziert für einen Neuling. Immer noch +1 –

-1

Ein JFrame kann nur eine Komponente haben (es sei denn, Sie verwenden eine BorderLayout). Die Lösung ist eine JPanel zu verwenden. Sie fügen die Objekte zu einem JPanel hinzu und fügen dann die JPanel zu JFrame hinzu. Sie müssen auch import javax.swing.JPanel; hinzufügen. Sie können es so etwas tun:

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();} 

Dies sollte funktionieren.

+0

Danke. Das Panel hat funktioniert .. – Sam

+0

@Sam Aber Daniel Rikowskis Antwort war nützlicher? ;-) –

+1

Ja. Natürlich. Deshalb habe ich diese Antwort akzeptiert. Aber ich hatte ein Problem mit dem Border Layout, welches ich gleich stellen wollte. Und das Panel gab mir sofort ein Ergebnis. :) Vielen Dank. – Sam

Verwandte Themen