Search code examples
javaswingjpaneljtextfieldlayout-manager

JTextField not showing up in JPanel on launch


The JTextField is there because when I move the mouse over where it's supposed to be the mouse icon changes to a cursor, then when I click it shows up. But it's invisible at launch. What am I missing?

public class JavaSwingTextfield extends JFrame {
    private static final long serialVersionUID = 1L;

    JTextField myTextField;

    public JavaSwingTextfield(){

        /***** JFrame setup *****/

        // Set the size of the window
        setSize(600,600);

        // Make the application close when the X is clicked on the window
        setDefaultCloseOperation(EXIT_ON_CLOSE);

        // Makes the JFrame visible to the user
        setVisible(true);

        /***** JFrame setup END *****/


        /***** JButton setup *****/

        // Create a JLabel and set its label to "Start"
        myTextField = new JTextField("Start");

        // Set the label's size
        myTextField.setSize(100, 50);

        // Put the label in a certain spot
        myTextField.setLocation(200, 50);

        // Set a font type for the label
        //Font myFont = new Font("Serif", Font.BOLD, 24);
        //myTextField.setFont(myFont);

        // Add the label to the JFrame
        add(myTextField);

        /***** JButton setup END *****/

    }


    /***** The main method *****/
    public static void main(String[] args){ 

        new JavaSwingTextfield();

    }

}

Solution

    • Use Event Dispatch Thread for creating GUI components
    • Do not call setVisible(..) before all components have been added to the JFrame ( this is the above code snippets actual error +1 to @Clark)
    • Do not unnecessarily extend JFrame class
    • Do not call setSize(..), rather simply call JFrame#pack() before setting the JFrame visible
    • Do not call setSize() on JTextField rather look at its constructor: JTextField(String text,int columns)
    • Use appropriate LayoutManagers, see here for some examples: A Visual Guide to Layout Managers

    Here is an example I made (basically your code with fixes):

    import javax.swing.JFrame;
    import javax.swing.JTextField;
    import javax.swing.SwingUtilities;
    
    public class JavaSwingTextfield {
    
        private JTextField myTextField;
    
        public JavaSwingTextfield() {
            JFrame frame = new JFrame();
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            
            myTextField = new JTextField("Start");
            
            // Add the label to the JFrame
            frame.add(myTextField);
            
            //pack frame to component preferred sizes
            frame.pack();
            frame.setVisible(true);
        }
    
        public static void main(String[] args) {
            //Create UI on EDT
            SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {
                    new JavaSwingTextfield();
                }
            });
        }
    }