Saltar al contenido

Cómo configurar el tamaño del componente dentro del contenedor con BoxLayout

No olvides que en las ciencias informáticas un error casi siempere puede tener diversas resoluciones, de igual modo te compartiremos lo mejor y más óptimo.

Solución:

Primero, debe darse cuenta de que la posición y el tamaño del componente en Java Swing depende del administrador de diseño (si el administrador de diseño está configurado), no del componente en sí. El componente solicita al gerente el tamaño.

Para este caso, usaría un diseño diferente: la combinación de GridLayout y BorderLayout es suficiente y muy simple y directa. Pero si quieres usar BoxLayout, entonces …

  1. La documentación dice:

    BoxLayout presta atención a los tamaños mínimos, preferidos y máximos solicitados de un componente. Mientras ajusta el diseño, es posible que deba ajustar estos tamaños. … Por ejemplo, el tamaño máximo de un botón es generalmente el mismo que su tamaño preferido. Si desea que el botón se ensanche cuando haya espacio adicional disponible, debe cambiar su tamaño máximo.

  2. Luego, establezca el tamaño máximo de los componentes: c.setMaximumSize(new Dimension(Integer.MAX_VALUE, c.getMinimumSize().height)); (c medio button, label y textField en tu ejemplo)

Edición 1:

Aquí está el código fuente de trabajo:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;

import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.WindowConstants;

public class Testy extends JPanel 
    public static void main(String[] args) 
        SwingUtilities.invokeLater(new Runnable() 
            public void run() 
                constructGUI();
            
        );
    

    private static void constructGUI() 
        JFrame frame = new JFrame("Testy");
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

        JPanel centerPanel = new JPanel();
        centerPanel.setBackground(Color.DARK_GRAY);
        centerPanel.setPreferredSize(new Dimension(100, 400));
        frame.add(centerPanel, BorderLayout.CENTER);

        Testy eastPanel = new Testy();
        frame.add(eastPanel, BorderLayout.EAST);

        frame.pack();
        frame.setVisible(true);
    

    public Testy() 
        setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS));

        JButton button = new JButton("Button ...... 1");
        //button.setPreferredSize(...);
        button.setMaximumSize(new Dimension(Integer.MAX_VALUE, button.getMinimumSize().height));
        add(button);

        button = new JButton("Button 2");
        //button.setPreferredSize(...);
        button.setMaximumSize(new Dimension(Integer.MAX_VALUE, button.getMinimumSize().height));
        add(button);

        button = new JButton("Button ........... 3");
        //button.setPreferredSize(...);
        button.setMaximumSize(new Dimension(Integer.MAX_VALUE, button.getMinimumSize().height));
        add(button);

        JLabel label = new JLabel("Label");
        //label.setPreferredSize(...);
        label.setMaximumSize(new Dimension(Integer.MAX_VALUE, label.getMinimumSize().height));
        add(label);

        JTextField textField = new JTextField();
        //textField.setPreferredSize(...);
        textField.setMaximumSize(new Dimension(Integer.MAX_VALUE, textField.getMinimumSize().height));
        add(textField);

        button = new JButton("Button 4");
        //button.setPreferredSize(...);
        button.setMaximumSize(new Dimension(Integer.MAX_VALUE, button.getMinimumSize().height));
        add(button);

        // add(Box.createVerticalGlue());
    

Captura de pantalla

Edición 2:

Si desea colocar el Botón 4 en la parte inferior de la columna derecha, agregue esta línea add(Box.createVerticalGlue()); Entre add(textField); y button = new JButton("Button 4");.

Como solución rápida, puede utilizar diseños anidados, en el sentido de que en el lado derecho, crea un JPanel con BorderLayout, Poner un JPanel(say compPanel) en el CENTER y un JPanel(say buttonPanel) a PAGE_END localización. Ahora usa un nuevo JPanel(say panel) con GridLayout y coloque todos los componentes en él, y coloque este compPanel dentro centerPanel. Lugar JButton(button4) dentro buttonPanel como es.

BoxLayout por el contrario, respeta el tamaño preferido de un determinado JComponent, que generalmente se calcula en función del contenido JComponent se mantiene o se da explícitamente, por lo tanto, los componentes no tienden a alinearse bien con respecto a otros componentes dados.

Aquí está el ejemplo de trabajo:

import java.awt.*;
import javax.swing.*;

public class Testy extends JPanel         

    private JPanel panel;
    private JPanel buttonPanel;

    public Testy() 
        setLayout(new BorderLayout(5, 5));

        JPanel compPanel = new JPanel();
        panel = new JPanel(new GridLayout(6, 1, 5, 5));     
        JButton button = new JButton("Button ...... 1");
        //button.setPreferredSize(...);
        //button.setMaximumSize(...);
        panel.add(button);

        button = new JButton("Button 2");
        //button.setPreferredSize(...);
        //button.setMaximumSize(...);
        panel.add(button);

        button = new JButton("Button ........... 3");
        //button.setPreferredSize(...);
        //button.setMaximumSize(...);
        panel.add(button);

        JLabel label = new JLabel("Label");
        //label.setPreferredSize(...);
        //label.setMaximumSize(...);
        panel.add(label);

        JTextField textField = new JTextField();
        //textField.setPreferredSize(...);
        //textField.setMaximumSize(...);
        panel.add(textField);
        compPanel.add(panel);

        buttonPanel = new JPanel();
        button = new JButton("Button 4");
        buttonPanel.add(button);

        add(compPanel, BorderLayout.CENTER);
        add(buttonPanel, BorderLayout.PAGE_END);
    

    private void constructGUI() 
        JFrame frame = new JFrame("Testy");
        frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);

        JPanel centerPanel = new JPanel();
        frame.getContentPane().setLayout(new BorderLayout(5, 5));
        centerPanel.setBackground(Color.DARK_GRAY);
        frame.add(centerPanel, BorderLayout.CENTER);

        frame.add(this, BorderLayout.LINE_END);

        frame.pack();
        frame.setVisible(true);
    

    public static void main(String[] args) 
        SwingUtilities.invokeLater(new Runnable() 
            @Override
            public void run() 
                new Testy().constructGUI();
            
        );
    

PRODUCCIÓN :

EJEMPLO DE DISEÑO

Reseñas y calificaciones

Acuérdate de que tienes permiso de agregar una reseña si te fue útil.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *