El método pack() en Java
Definido en la clase Window en Java, el método pack()
dimensiona el marco de tal manera que el contenido del marco está en o por encima de sus tamaños preferidos.
Podemos reemplazar el método pack()
definiendo el tamaño del marco explícitamente. Para ello, utilizamos los métodos setSize()
o setBounds()
. El método setBounds()
también establece la ubicación del marco.
Pero estos métodos no dejan al administrador de diseño de marcos a cargo del tamaño del marco, a diferencia del método pack()
. El administrador de diseño de marcos puede ajustarse a diferentes plataformas y otros factores que afectan el tamaño del componente. Por lo tanto, es recomendable utilizar el método pack()
.
Sintaxis:
public void pack()
El método pack()
une todos los componentes. Para ver cómo funciona, veamos un ejemplo práctico. Haremos un botón que devuelva algo de texto en el campo de texto al hacer clic en él.
import java.awt.event.*;
import javax.swing.*;
public class ButtonDemo {
public static void main(String[] args) {
JFrame jf = new JFrame("Button Example");
final JTextField tf = new JTextField();
// using setBounds() method for textfield
tf.setBounds(50, 50, 150, 20);
JButton b = new JButton("Click this button");
// using setBounds() method for Button
b.setBounds(50, 100, 95, 30);
b.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
tf.setText("Java is interesting.");
}
});
jf.add(b);
jf.add(tf);
jf.setSize(300, 300);
jf.setLayout(null);
jf.setVisible(true);
}
}
Producción:
Tenga en cuenta que no estamos usando el método pack()
en ninguna parte de este ejemplo. En su lugar, hacemos uso del método setBounds()
. Los argumentos del método setBounds()
para el campo de texto son 50, 50, 150, 20
y para el botón son 50, 100, 95, 30
.
Además, tenga en cuenta que el botón no puede mostrar el texto completo. Veremos esto también en las siguientes secciones. Sabemos que los administradores de diseño establecen automáticamente el tamaño y la posición de los componentes agregados.
Dado que el método pack()
es el que hace que los administradores de diseño se encarguen del marco, necesitamos usar el método setBounds()
en su ausencia.
Uso del Método SetBounds()
en Java
Para usar esto en lugar del método pack()
, necesitamos pasar argumentos para especificar la posición y el tamaño de los componentes dentro de la ventana principal.
Se necesitan cuatro argumentos. Los dos primeros son para especificar la posición (arriba a la izquierda)
del componente y los dos últimos son para especificar el tamaño (ancho-alto)
del componente.
Sintaxis:
setBounds(int x - coordinate, int y - coordinate, int width, int height)
Mire la siguiente pieza de código en el ejemplo anterior.
jf.setLayout(null);
Cuando usamos el método setBounds()
, configuramos el layout manager
como nulo.
Uso del Método Pack()
en Java
Ahora, mira un ejemplo más que usa el método pack()
.
import java.awt.*;
import javax.swing.*;
public class ButtonDemo extends JFrame {
public ButtonDemo() { // This is the name of the class
// This will appear in the title bar of output window
setTitle("Buttons using pack()");
setLayout(new FlowLayout());
setButton();
// This calls the pack method
pack();
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
setVisible(true);
}
void setButton() {
for (int i = 1; i < 9; i++) {
add(new JButton("Button" + i));
}
}
public static void main(String args[]) {
new ButtonDemo();
}
}
Producción:
En este ejemplo, no estamos utilizando el método setBounds()
para establecer la posición y el tamaño de los componentes. En su lugar, llamamos al método pack()
, que se ocupa del tamaño y la posición de los componentes por sí solo.
Aquí, la clase ButtonDemo
amplía la clase JFrame
. La clase JFrame
es un contenedor que actúa como una ventana para contener los diversos componentes de la GUI como botones, etiquetas y campos de texto.
Además, podemos usar el siguiente código en lugar del bucle for
, pero aumenta innecesariamente la longitud del código.
JButton b1 = new JButton("Button 1");
JButton b2 = new JButton("Button 2");
JButton b3 = new JButton("Button 3");
JButton b4 = new JButton("Button 4");
JButton b5 = new JButton("Button 5");
JButton b6 = new JButton("Button 6");
JButton b7 = new JButton("Button 7");
JButton b8 = new JButton("Button 8");
add(b1);
add(b2);
add(b3);
add(b4);
add(b5);
add(b6);
add(b7);
add(b8);
Para obtener más información sobre cómo crear un marco con Java, consulte esta documentación.
Si eliminamos el método pack()
, obtendremos la salida, pero los botones solo son visibles al cambiar el tamaño del panel. Esta es la salida cuando no usamos los métodos pack()
o setBounds()
.
Podemos redimensionarlo para ver los botones.
Pero esta no es una buena representación y, por lo tanto, debemos usar cualquiera de los métodos pack()
o setBounds()
. El método pack()
es fácil de usar y preciso y cumple su propósito en una sola línea de código.
El método setBounds()
necesita las coordenadas x
e y
como argumentos. Esto puede necesitar muchos cambios y reajustes porque determinar las coordenadas a la vez a menudo no es fácil.
Además, el método pack()
ajusta el tamaño del botón en consecuencia, pero el método setBounds()
no puede hacerlo por sí solo. Necesitamos pasar diferentes argumentos para ancho y alto para diferentes longitudes de texto dentro del botón.
Mire la salida del primer ejemplo nuevamente.
El botón no puede mostrar el texto completo Click this button
porque el tamaño del botón es más pequeño que el requisito de este texto. Para rectificar esto, tendremos que cambiar el valor del argumento ancho.
Pero si usamos el método pack()
, cambiará el tamaño del botón por sí solo según el texto que contiene.
import java.awt.*;
import javax.swing.*;
public class ButtonDemo extends JFrame {
public ButtonDemo() {
setTitle("Using the pack() method");
setLayout(new FlowLayout());
setButton();
// Calling the pack() method
pack();
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
setVisible(true);
}
void setButton() {
for (int i = 1; i < 7; i++) {
add(new JButton("Click this Button" + i));
}
}
public static void main(String args[]) {
new ButtonDemo();
}
}
Producción:
Tenga en cuenta que todo el texto cabe dentro de los botones sin tener que cambiar su tamaño manualmente. Esta es la ventaja de usar el método pack()
sobre el método setBounds()
.
Para saber más sobre cómo hacer una GUI usando Swing, consulte esta documentación.
Conclusión
El método pack()
hace que el administrador de diseño esté a cargo, que redimensiona y coloca los componentes en el panel correctamente.
Podemos usar el método setBounds()
como alternativa al método pack()
, pero se prefiere el uso del método pack()
porque se ajusta fácilmente a los cambios por sí solo, a diferencia del método setBounds()
. El método pack()
es necesario para unir todos los componentes.