2013-03-02 24 views
8

Non è possibile aggiungere JTextField a JFrame. Il mio JFrame contiene uno JLabel e uno JTextField. In primo luogo, ho aggiunto il JLabel e sta funzionando. Ecco il codice.Non è possibile aggiungere JTextField a 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

Poi ho aggiunto JTextField.

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

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

    frame.setVisible(true); 

Ma poi mostra un output come questo.

Frame having JLabel and JTextField

Si prega di qualcuno mi aiuti su questo issue.Can aggiungo più di un componente alla JFrame? Come io sono nuovo a Java, sto avendo una confusione tra telaio, ContentPane e layout.

+4

+1 per una domanda strutturata in modo eccellente. – christopher

risposta

8

In realtà, è possibile aggiungere JTextField. Il problema che stai riscontrando deriva dal gestore di layout che lo estende su tutto il fotogramma.

Il riquadro del contenuto di JFrame utilizza un gestore BorderLayout per impostazione predefinita. (Vedi How to Use BorderLayout)

Nella mia domanda si è sempre finito usando il gestore MigLayout, ma prima si consiglia di familiarizzare con i gestori di layout in generale. (Vedi A Visual Guide to Layout Managers)

+0

+1 per MigLayout - Anch'io finisco per usare questo quando cerco i layout – exexzian

3

Il tuo ContentPane ha un BorderLayout per impostazione predefinita, che accetta solo un singolo elemento (nella posizione predefinita - il centro). Dopo aver aggiunto un secondo elemento (lo JTextField), ha sostituito l'ultimo (lo JLabel).

Quando si aggiungono elementi a Container utilizzando l'argomento singolo add, non si specifica in quale posizione si desidera, quindi il gestore di layout sceglie una posizione a piacere. OTOH se si specificano vincoli (usando lo overloaded add), si ha più controllo su dove verrà posizionato l'elemento. Controlla i documenti per ogni gestore di layout per vedere come funzionano e quali vincoli supporta.

Per la vostra situazione attuale, è possibile utilizzare un intermedio JPanel (che ha FlowLayout come il suo predefinito LayoutManager - l'IMHO più semplice per chi sta ancora imparando) invece di aggiungere elementi direttamente al riquadro del contenuto, o semplicemente cambiare il layout a qualcosa altro.

+0

Buona risposta, ma un po 'troppo complicata per un principiante. Ancora +1 –

-1

A JFrame può avere solo un componente (a meno che non si stia utilizzando un BorderLayout). La soluzione è usare un JPanel. Aggiungete gli oggetti a un JPanel e quindi aggiungete lo JPanel allo JFrame. È necessario aggiungere anche import javax.swing.JPanel;. Puoi fare qualcosa del genere:

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

Questo dovrebbe funzionare.

+0

Grazie ... Il pannello ha funzionato .. – Sam

+0

@ Sam Ma la risposta di Daniel Rikowski è stata più utile? ;-) –

+1

Sì, certo. Ecco perché ho accettato quella risposta. Ma ho avuto qualche problema nel Border Layout, che stavo per chiedere. E il pannello mi ha dato un risultato immediato. :) Grazie. – Sam