Solo aparece un componente en JFrame

Resuelto asked hace 11 años • 1 respuestas

Como mejora a mi proyecto de cifrado, decidí hacer una pequeña GUI. Sin embargo, cuando ejecuto el programa, sólo el elemento superior aparece en la pantalla y parece ocultar los demás, aunque no tengo forma de comprobarlo. ¿Alguien sabe por qué?

A continuación se muestra mi código en su totalidad, además, e()porque d()simplemente cifran una cadena y no tienen nada que ver con una GUI. También me gustaría encontrar una forma de acelerarlo tanto como sea posible sin editar el cifrado, solo para hacerlo lo mejor posible.

@SuppressWarnings("serial")
public class EncDecExample extends JFrame implements ActionListener {
    final static JPanel top = new JPanel();
    final static JPanel mid = new JPanel();
    final static JPanel bot = new JPanel();
    final static JTextField in = new JTextField(10);
    final static JTextField out = new JTextField(10);
    final static JButton enc = new JButton("Encrypt");
    final static JButton dec = new JButton("Decrypt");
    final static JFrame f = new JFrame("Encryption/decryption");

    public static void main(String[] args) {
//        EncDec.exampleImplement();

        f.setSize(500, 500);
        f.setResizable(false);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        out.setEditable(false);
        out.setText("Hello");
        in.setVisible(true);
        out.setVisible(true);
        enc.setVisible(true);
        dec.setVisible(true);
        top.add(in);
        mid.add(enc);
        mid.add(dec);
        bot.add(out);
        f.add(top);
        f.add(mid);
        f.add(bot);
        f.setVisible(true);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == enc && !in.getText().equalsIgnoreCase("")) {
            out.setText(EncDec.e(in.getText(), 5));
        }
        else if(e.getSource() == dec && !in.getText().equalsIgnoreCase("")) {
            out.setText(EncDec.d(in.getText()));
        }
    }
}
 avatar Dec 14 '12 22:12
Aceptado

El panel de contenido de a JFrametiene un archivo BorderLayout. Si coloca un componente en un BL sin restricciones, terminará en el archivo CENTER. El centro sólo puede mostrar un componente.

Para un efecto inmediato, sugiero:

f.add(top, BorderLayout.PAGE_START);
f.add(mid);
f.add(bot, BorderLayout.PAGE_END);

Otros puntos.

  1. Sacar f.setSize(500, 500);y llamar pack()inmediatamente antes.setVisible(true)
  2. Para obtener una mejor manera de finalizar la GUI, cambie f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);af.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
  3. in.setVisible(true);Excepto el marco en sí, sácalos. Un componente se vuelve visible automáticamente cuando se agrega a un contenedor de nivel superior y ese contenedor se hace visible.
  4. Cambiar
    public class EncDecExample extends JFrame
    a
    public class EncDecExample
    Este código mantiene una referencia a un marco, y ese es el camino correcto a seguir.
Andrew Thompson avatar Dec 14 '2012 15:12 Andrew Thompson