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 …
-
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.
-
Luego, establezca el tamaño máximo de los componentes:
c.setMaximumSize(new Dimension(Integer.MAX_VALUE, c.getMinimumSize().height));
(c
mediobutton
,label
ytextField
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());
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 :
Reseñas y calificaciones
Acuérdate de que tienes permiso de agregar una reseña si te fue útil.