Saltar al contenido

Obtenga la altura del texto de varias líneas con un ancho fijo para que el diálogo cambie de tamaño correctamente

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.

¡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 *