Luego de consultar expertos en esta materia, programadores de deferentes áreas y profesores dimos con la solución al problema y la dejamos plasmada en esta publicación.
Solución:
Aquí hay una adaptación de su código, haciendo lo que quiere. Pero necesita un pequeño truco para calcular el tamaño de la etiqueta y establecer su tamaño preferido.
Encontré la solución aquí.
import static javax.swing.GroupLayout.DEFAULT_SIZE;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
import javax.swing.text.View;
public class TextSizeProblem extends JFrame
public TextSizeProblem()
String dummyString = "";
for (int i = 0; i < 100; i++)
dummyString += " word" + i; // Create a long text
JLabel text = new JLabel();
text.setText("" + dummyString + "");
Dimension prefSize = getPreferredSize(text.getText(), true, 400);
JButton packMeButton = new JButton("pack");
packMeButton.addActionListener(new ActionListener()
public void actionPerformed(ActionEvent e)
pack();
);
GroupLayout layout = new GroupLayout(this.getContentPane());
getContentPane().setLayout(layout);
layout.setVerticalGroup(layout.createParallelGroup().addComponent(packMeButton)
.addComponent(text,DEFAULT_SIZE, prefSize.height, prefSize.height));
layout.setHorizontalGroup(layout.createSequentialGroup().addComponent(packMeButton)
.addComponent(text, DEFAULT_SIZE, prefSize.width, prefSize.width) // Lock the width to 400
);
pack();
public static void main(String args[])
SwingUtilities.invokeLater(new Runnable()
public void run()
JFrame frame = new TextSizeProblem();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
);
private static final JLabel resizer = new JLabel();
/**
* Returns the preferred size to set a component at in order to render an html string. You can
* specify the size of one dimension.
*/
public static java.awt.Dimension getPreferredSize(String html, boolean width, int prefSize)
resizer.setText(html);
View view = (View) resizer.getClientProperty(javax.swing.plaf.basic.BasicHTML.propertyKey);
view.setSize(width ? prefSize : 0, width ? 0 : prefSize);
float w = view.getPreferredSpan(View.X_AXIS);
float h = view.getPreferredSpan(View.Y_AXIS);
return new java.awt.Dimension((int) Math.ceil(w), (int) Math.ceil(h));
Encontré una solución a mi problema. Al reemplazar el JLabel con un JTextArea:
JTextArea text = new JTextArea(); text.setText(dummyString); text.setLineWrap(true); text.setWrapStyleWord(true);
Y llamando a pack() seguido de una invocación al administrador de diseño para diseñar los componentes nuevamente seguido de otro paquete:
pack(); layout.invalidateLayout(this.getContentPane()); pack();
Esto hará que el administrador de diseño se adapte al ancho.
El código completo:
import static javax.swing.GroupLayout.DEFAULT_SIZE;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
public class TextSizeProblem3 extends JFrame
public TextSizeProblem3()
String dummyString = "";
for (int i = 0; i < 100; i++)
dummyString += " word" + i; //Create a long text
JTextArea text = new JTextArea();
text.setText(dummyString);
text.setLineWrap(true);
text.setWrapStyleWord(true);
JButton packMeButton = new JButton("pack");
packMeButton.addActionListener(new ActionListener()
public void actionPerformed(ActionEvent e)
pack();
);
GroupLayout layout = new GroupLayout(this.getContentPane());
getContentPane().setLayout(layout);
layout.setVerticalGroup(layout.createParallelGroup()
.addComponent(packMeButton)
.addComponent(text)
);
layout.setHorizontalGroup(layout.createSequentialGroup()
.addComponent(packMeButton)
.addComponent(text, DEFAULT_SIZE, 400, 400) //Lock the width to 400
);
pack();
layout.invalidateLayout(this.getContentPane());
pack();
public static void main(String args[])
SwingUtilities.invokeLater(new Runnable()
public void run()
JFrame frame = new TextSizeProblem3();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
);
(puede agregar algo de personalización (borde, color, etc.) para que se vea como JLabel pero lo he omitido)
Creo que esto es lo que quieres:
JLabel label = new JLabel("Lots of text here...");
// add the label to some Container.
Esto restringirá JLabel a 200 píxeles de ancho y ajustará automáticamente la altura para que se ajuste al texto.
Comentarios y calificaciones
Si haces scroll puedes encontrar las crónicas de otros programadores, tú asimismo tienes la habilidad dejar el tuyo si lo crees conveniente.