Autor Tema: Layouts en paneles [Java] ventanas JPanel FlowLayout JFrame BorderLayout GridBag  (Leído 5485 veces)

Toshirou

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 5
    • Ver Perfil
Estoy practicando con layouts, que es un tema que se me ha complicado un poco por el momento y bueno, he estado leyendo algo sobre el tema. Tengo entendido que algunos contenedores como el JPanel tienen el FlowLayout por defecto y que el JFrame tiene el BorderLayout. Pues bueno, probando, quise poner un JPanel en la parte NORTH del frame y otro JPanel en la parte CENTER. Dentro del NORTH, puse un boton, el cual quería posicionarlo al lado izquierdo (FlowLayout.LEFT), pero no se mueve por nada... entonces no entiendo el porqué.

Les dejo mi código, gracias.


Código: [Seleccionar]
         this.setSize(400, 400); // tamaño de la ventana
        // ####################### PANEL TOP #######################
        panelTop = new JPanel();
        panelTop.setBackground(Color.BLACK);
        //panelTop.setPreferredSize(new Dimension(400, 300));
        panelTop.add(new JButton("Left"), FlowLayout.LEFT);
       
       
        // ####################### PANEL CENTER #######################
        panelCenter = new JPanel();
        panelCenter.setBackground(Color.DARK_GRAY);
       
       
        this.add(panelTop, BorderLayout.NORTH);
        this.add(panelCenter, BorderLayout.CENTER);
        this.setLocationRelativeTo(null);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

También probé estableciendo explicitamente FlowLayout al panel que está en NORTH y nada
« Última modificación: 09 de Agosto 2018, 22:19 por Ogramar »

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 988
    • Ver Perfil
Re:Layouts en paneles [Java]
« Respuesta #1 en: 18 de Julio 2018, 00:56 »
FlowLayout.LEFT no implica que se ponga a la izquierda.
Lo que hace es que se pondrá en el centro, y a partir de ahí, "flotará" a la izquierda en el caso de que añadas más objetos a ese panel para dejarles sitio y todo el conjunto de objetos quede lo más centrado posible.
Pero si dejas a ese boton solo, como ya has comprobado, se quedará en el centro.

Además, el FlowLayout.LEFT creo que no se lo puedes especificar al boton. Se lo especificas al Layout del panel, para decirle si quieres que los objetos floten a la izquierda, o a la derecha.
Pero no podrías por ejemplo, indicar distintas direcciones de "flotación" a cada objeto de ese panel.

El tema layouts es toda una pelea para aprenderles a sacar partido.
Muchas veces es necesario combinar layouts hasta encontrar una manera de obtener, o al menos acercarnos, a lo que tenemos en mente.
Hay un layout bastante "poderoso", el GridBagLayout, pero llegar a entenderlo y utilizarlo bien, a veces requiere más tiempo y código del que vale la pena invertir.

En tu caso, si tan solo quieres poner ese boton. Puedes eliminar el layout de ese panel.
panelTop.setLayout(null);
y luego especificar tu la posicion y tamaño de ese boton:
JButton botonLeft = new JButton("LEFT");
panelTop.add(botonLeft);
botonLeft.setBounds (5,5,35,20);//Posicion 5,5 y tamaño 35px de ancho y 20px alto

El problema de esto es que al redimensionar la ventana los componentes no se adaptarán  y además el JPanel tampoco se adaptará bien a todos los componentes, teniendo que establecer tu manualmente tamaño por defecto, tamaño preferido, tamaño maximo....

Suele se mala opción esta de "nullear" el layout.

Otra opción más adecuada para desplazar objetos a las posiciones que deseas, es la de añadir "Componentes Invisibles" para que hagan de relleno y "empujen" tu botón hacia donde quieras colocarlo.

Echa un vistazo a esta parte de la documentación oficial
Está en inglés, pero se entiende bien.

No dudes en hacer pruebas, trastear y cacharrear con esto y también con otros layouts.

Cada uno tiene sus comportamientos, peculiaridades, virtudes y limitaciones. Y la única forma de conocerlas es experimentar con ellos.

Paciencia, yo llevo algún tiempo practicando y aún muchas veces tengo algunas dificultades


Mucha gente usa editores SWING automatizados que se pueden implementar a Eclipse, Netbeans..
Tú colocas objetos en un editor visual y el se encarga de añadir el código necesario para que se quede donde tú le digas.

Personalmente no me gusta usarlos.
Quizás para actividad profesional donde no puedes perder tiempo experimentando puede estar bien.
Pero para los que estamos aprendiendo, creo que es mejor pelearnos nosotros con la documentación y buscando ejemplos o tutoriales en la red.

Además estos editores suelen incluir muchas líneas de código, algunas no siempre necesarias y como programador te encuentas con un archivo de texto descomunal, donde pierdes el control de qué hace cada una de esas lineas, cuál es su propósito, cómo y a cuál componente afecta...
Y a mi me gusta tener absoluto control y conocimiento de cada linea de código. Y escribirlo a mi manera, de forma que se pueda entender e intuir que es cada cosa, incluso si es necesario escribo varios archivos .java por separado para cada uno de los JPanel que componen mi JFrame, evitando así un único archivo .java gigantesco.
NO respondo dudas por mensaje privado
Publicando vuestras dudas en el foro público conseguimos:
- Que más gente aporte respuestas mejores o complementarias.
- Que otras personas puedan aprender de vuestras dudas.

Mejor en PÚBLICO que en privado. Gracias

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".