¿Por qué mis artículos no aparecen en JFrame?

Soy bastante nuevo en JFrame y quiero saber por qué mis artículos no se muestran en la ventana. Sé que no tengo un ActionHandler, pero solo quiero que mis campos de texto aparezcan en mi ventana. Aquí está mi código:

import java.awt.Font; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPasswordField; import javax.swing.JTextField; public class FirstGUI extends JFrame{ public void GUI(){ setTitle("Welcome"); setResizable(false); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setVisible(true); setSize(600,600); JLabel title = new JLabel(); title.setText("Apple Inc. Member Login Port"); title.setFont(new Font("Arial", Font.PLAIN, 24)); JTextField login = new JTextField("Login",10); JPasswordField pass = new JPasswordField("Password"); add(title); add(login); add(pass); } public static void main(String[] args){ FirstGUI a = new FirstGUI(); a.GUI(); } } 

pero cuando lo ejecuto, entiendo esto:

enter image description here

pero cuando lo ejecuto, entiendo esto:

Obtendrá una pantalla vacía porque agrega los componentes al marco después de que el marco esté visible.

  1. Como ya se sugirió, debe usar un administrador de diseño apropiado. FlowLayout es el más fácil para comenzar.
  2. invocar setVisible(true) DESPUÉS de agregar los componentes al marco.

Entonces el código debería ser más como:

 panel.add(...); panel.add(...); add(panel); pack(); setVisible(true); 

El administrador de diseño predeterminado para JFrame es BorderLayout .

Esto significa que sus componentes esencialmente se han agregado uno encima del otro.

Intente cambiar el administrador de diseño a algo así como FlowLayout (por ejemplo) …

enter image description here

Eche un vistazo a la Guía visual de administradores de diseño y al uso de administradores de diseño para obtener más detalles.

Además, evite setSize siempre que sea posible, use Window#pack lugar

Actualizar

También me gustaría presentarte los hilos iniciales que deberían usarse para iniciar tu código de UI …

Acepto las sugerencias de MadProgrammer (+1)

Bueno, echemos un vistazo a su progtwig

Usted realmente ha creado un JFrame con componentes en él. Está funcionando bien también, pero tu pregunta de “¿por qué mis elementos no aparecen en el JFrame?” No es porque hiciste algo mal sino porque perdiste algo, es decir, revalidar ()

Tratar:

 public static void main(String[] args){ FirstGUI a = new FirstGUI(); a.GUI(); a.revalidate(); } 

No estoy diciendo que esto te dará una UI perfecta. Lo que trato de decir es que esto te ayudará a entender mejor el Swing. Obtenga información acerca de los administradores de Swing Layout y luego trabaje en su UI para obtener mejores resultados.

revalidate (): este componente y todos los elementos superiores se marcan como necesarios. Esto significa que el Administrador de diseño intentará realinear los componentes. A menudo se usa después de quitar los componentes. Es posible que algunas personas realmente bruscas puedan perder esto. Creo que solo sabrás esto si realmente estás usando Swing.

La única razón:

 setVisible(True); method for the frame should be put on the end of the code. 

si le das esta línea en la parte superior del código que es cuando creas un marco. Esto causará ese problema.

No agregue los componentes directamente a su marco. En su lugar, agregue al panel de contenido , que es donde JFrame almacena todos los componentes que dibuja. Usualmente esto es un JPanel.

Aquí hay un ejemplo:

 public class GUI { private JPanel content; public void GUI { /*Other code*/ content = new JPanel(); add(content); //make content the content pane content.add(title); content.add(login); content.add(pass); } 

Si eso falla, llame a setVisible(true) y setEnabled(true) en todos sus componentes.

En una nota lateral, es posible que desee hacer que su función GUI un constructor.

 import javax.swing.*; import java.awt.*; class Myframec extends JFrame { Myframec() { Container c = this.getContentPane(); c.setLayout(null); this.setBounds(10,10,700,500); this.setTitle("Welcome"); this.setDefaultCloseOperation(this.EXIT_ON_CLOSE); JPanel panel = new JPanel(); panel.setBounds(0,0,700,500); panel.setBackground(Color.gray); panel.setLayout(null); c.add(panel); Font f = new Font("Arial",Font.BOLD,25); Font f1 = new Font("Arial",Font.BOLD,20); JLabel lable = new JLabel(); lable.setBounds(130,10,400,100); lable.setText("Apple Inc. Member Login Port"); lable.setFont(f); panel.add(lable); JTextField login = new JTextField("Login",10); login.setBounds(120,150,400,30); login.setFont(f1); panel.add(login); JPasswordField pass =new JPasswordField("Password"); pass.setBounds(120,200,400,30); pass.setFont(f1); lable.setFont(f); panel.add(pass); c.setVisible(true); this.setVisible(true); } public static void main(String[] argm) { Myframec frame = new Myframec(); frame.setVisible(true); } }