Duda sobre Layouts

Iniciado por Drewermerc, 22 Noviembre 2014, 09:18 AM

0 Miembros y 1 Visitante están viendo este tema.

Drewermerc

Hola a todos.

Bueno mi la duda que tengo es si se puede manejar algun tipo de layout y paneles pero donde pueda distribuir los elementos libremente algo así como cuando se usa un JFrame sin layout y se usa la opción setBounds.
Lo e intentado con GridLayout, BoxLayout y Border layout pero no e encontrado una forma de mover los objetos libremente como el JTextFiel, JButton y JLabel.
lo que intentado hasta ahorita es esto.
Código (java) [Seleccionar]

import javax.swing.JFrame;
import javax.swing.JMenuBar;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JButton;
import javax.swing.JTextField;
import javax.swing.JLabel;
import javax.swing.JPasswordField;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.BoxLayout;

import java.awt.Container;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.Component;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridLayout;

public class Layout extends JFrame implements ActionListener{
    private JFrame window;
    private JButton exit;
    private JMenuBar menuBar;
    private JMenu menuEdit;
    private JMenuItem itemUno;
    private JTextField user;
    private JPasswordField pUser;
    private JLabel labelUser;
    private JLabel label;
    private JLabel msg;
    private JPanel topPanel;
    private JPanel centerPanel;
    private Container containerMain;
    private final int COLUMS = 1;
    private final int ROWS = 15;
   
    //constructor
    public Layout(){
        window = new JFrame("prueba");
        exit = new JButton("salir");
        menuBar = new JMenuBar();
        menuEdit = new JMenu("uno");
        itemUno = new JMenuItem("sub uno");
        user = new JTextField("uno", 15);
        pUser = new JPasswordField(15);
        labelUser = new JLabel("dos ");
        label = new JLabel("dos ");
        msg = new JLabel();
        topPanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
        centerPanel = new JPanel(new GridLayout(ROWS, COLUMS));
        containerMain = window.getContentPane();
    }
   
    //metodo para hacer visible la ventana
    public void windowVisible(){
        panelMenu();
        centerObjects();
        buildAll(window.getContentPane());
        window.pack();
        window.setBounds(100, 100, 200, 400);
        window.setVisible(true);
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
   
   
    public void panelMenu(){
        window.setJMenuBar(menuBar);
        menuBar.add(menuEdit);
        menuEdit.add(itemUno);
    }
   
    public void centerObjects(){
        centerPanel.setBackground(Color.red);
        topPanel.setBackground(Color.blue);
       
        centerPanel.add(labelUser);
       
        centerPanel.add(user);
       
        centerPanel.add(label);
       
        centerPanel.add(pUser);
       
        exit.addActionListener(this);
        centerPanel.add(exit);
       
        msg.setVisible(false);
        topPanel.add(msg);
       
        itemUno.addActionListener(this);
       
    }
   
    public void buildAll(Container content){
       
        content.setLayout(new BorderLayout());
        content.add(topPanel, BorderLayout.NORTH);
        content.add(centerPanel, BorderLayout.CENTER);
    }
   
    @Override
    public void actionPerformed(ActionEvent action){
        if (action.getSource() == exit){
            System.exit(0);
        }
       
        if(action.getSource() == itemUno){
            JOptionPane.showMessageDialog(null, "hola", "ventana", JOptionPane.INFORMATION_MESSAGE);
            msg.setVisible(true);
            msg.setText(msg.getText() + "holaaa");
        }
    }
   
    public static void main(String[] args) {
        Layout principal = new Layout();
        principal.windowVisible();
    }
   
}


Bueno espero que me puedan ayudar.
Saludos.
Drewermerc.

MNicolas


Drewermerc

hola Nicolão.
gracias por responder.
Estuve revisando ese layout y bueno vi que es muy parecido a cuando se usa setLayout(null), me podrias decir si hay alguna diferencia entre estas dos formas.

saludos.
Drewermerc.

Chuidiang

Hola:

El más versátil es GridBagLayout, aunque puede ser un poco lío. Es similar a un GridLayout (una matriz de componentes), pero mucho más versátil. Aquí tienes un tutorial http://www.chuidiang.com/java/layout/GridBagLayout/GridBagLayout.php

Se bueno.

Drewermerc

#4
Hola Chuidiang.
gracias por responder.
bueno estuve probando en GridBagLayout y si es un poco lioso pero bueno tengo una pregunta no se si se puede hacer lo estuve intentando pero no e logrado el resultado lo que quisiera saber si se puede hacer lo siguiente.
por ejemplo en el tutorial que me bridaste viene un JTextField en la parte inferior en medio de los botones pero por ejemplo se puede poner el JTextField en la parte superior y al lado un JLabel ahora despues de tener estos dos elementos se puede poner un boton abajo de estos dos objetos pero que quede en medio.
aqui podria un ejemplo con lineas espero que se entienda mi duda.
Código (java) [Seleccionar]

JLabel           JTextFiel
----------------  -------------------
         JButton
      ------------------


Saludos.
Drewermerc.

Chuidiang

Hola:

Si te fijas en el tutorial que te pase, en uno de los pasos intermedios, hay una imagen en la que "boton 3" y "campo de texto" quedan abajo, uno a cada lado y el "area texto" queda centrada encima de ellos. Lo que tu quieres es lo mismo, pero con los dos de abajo arriba y el de arriba abajo. No debería ser difícil.

Se bueno.

Drewermerc

bueno creo que te refieres a usar la propiedad fill del constraints y eso si lo pude hacer pero no hay una forma de reducir el tamaño del boton porque se agusta al tamaño de los dos objetos en este caso del JTextField y el JLabel.
y bueno dos pregunta mas.
¿hay alguna manera de que al redimencionar la ventana se redimencionen los objeto?
Tu sabes como hacer que los objetos se puedan se parar cuando los alineas en el eje de las "y", yo intente creando un JLabel con espacios y ponerlo arriba de los objetos eneste caso pobrebe poniendo una arriba del JTextField y si funciona pero queria saber. ¿si hay otra alternativa a la que estoy haciendo?

Saludos.
Drewermerc

Chuidiang

Hola:

Mira el tutorial con calma, todo eso que preguntas está más o menos explicado. En la foto que te mencioné antes, el área de texto NO crece hasta ocupar el tamaño de los otros dos componentes y se cuenta qué es lo que hay que poner para que crezca, así que si a tí te crece posiblemente es que estás poniendo ese algo.

Se bueno.

Drewermerc

#8
hola Chuidiang.
Bueno gracias por todo tenias razon y bueno yo me confundi, pense que los valores de la propiedad fill solo podian ser los que se dicen en el tutorial pero ya veo que no.
Lo unico que no solo encontrar como es que se redimencionen los objetos junto cuando preciono el boton de mazimizar, se quedan del mismo tamaño los objetos.
No me habia dado cuenta pero creo que eres el autor de esa pagina, felicidades esta muy interesante.
Saludos.
Drewermerc.