Come posso creare un JTextArea con una larghezza specificata e la più piccola altezza possibile necessario per visualizzare tutto il testo?

StackOverflow https://stackoverflow.com/questions/4083322

Domanda

In tutti gli esempi che posso trovare che l'uso di un JTextArea, l'altezza e la larghezza è noto prima di costruire il JTextArea, e se il JTextArea richiederebbe più di altezza, allora viene messo all'interno di una JScrollPane. Ovviamente, l'altezza di JTextArea dipende dalla larghezza e il contenuto del testo.

Ora, la mia situazione richiede che io non uso un JScrollPane, ma invece che la JTextArea essere appena sufficiente alto per visualizzare tutto il testo. Quando creo il JTextArea, so che il contenuto del testo e quanto la larghezza si dovrà lavorare con; Non so l'altezza - voglio che, per essere il più piccolo possibile senza tagliare fuori qualsiasi del testo. Questo sembra molto difficile da realizzare.

Come nota laterale, il JTextArea viene aggiunto a una JPanel che non dispone di un gestore di layout - utilizza il posizionamento assoluto basato sulla dimensione preferita del componente aggiunto. Ciò richiede che il mio JTextArea sarebbe tornato alle dimensioni corrette sulla getPreferredSize(). Le dimensioni corrette dovrebbero essere la larghezza che ho fornito quando ho costruito, e l'altezza minima richiesta per visualizzare tutto il testo con la larghezza disponibile.

Ho trovato alcune discussioni simili che discutono le stranezze / insetti coinvolti con l'JTextArea che a volte sono risolti chiamando pack() due volte il contenitore principale. Questa non è un'opzione per me. Sono tentato di fondamentalmente creare il mio JTextArea che prende una larghezza e stringa e calcola l'altezza minima necessaria in base alla larghezza e impostazioni dei caratteri, ma ho pensato che avrei chiedere in giro prima di spendere il tempo per farlo.

Spero che la mia domanda è chiara. Grazie a tutti per il vostro aiuto!

È stato utile?

Soluzione

  

utilizza il posizionamento assoluto basato sulla dimensione preferita del componente aggiunto.

suona come il lavoro di un gestore di layout.

  

Ciò richiede che il mio JTextArea sarebbe tornato le dimensioni corrette sulla getPreferredSize ().

JTextArea textArea = new JTextArea();
textArea.setLineWrap( true );
textArea.setWrapStyleWord( true );
textArea.setText("one two three four five six seven eight nine ten");
System.out.println("000: " + textArea.getPreferredSize());
textArea.setSize(100, 1);
System.out.println("100: " + textArea.getPreferredSize());
textArea.setSize( textArea.getPreferredSize() );

Altri suggerimenti

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

class FixedWidthLabel {

    public static void main(String[] args) {

        Runnable r = new Runnable() {
            public void run() {
                String pt1 = "<html><body width='";
                String pt2 =
                    "px'><h1>Label Height</h1>" +
                    "<p>Many Swing components support HTML 3.2 &amp;" +
                    " (simple) CSS.  By setting a body width we can cause the " +
                    " component to find the natural height needed to display" +
                    " the component.<br><br>" +
                    "<p>The body width in this text is set to " +
                    "";
                String pt3 =
                    " pixels." +
                    "";

                JPanel p = new JPanel( new BorderLayout() );

                JLabel l1 = new JLabel( pt1 + "125" + pt2 + "125" + pt3 );
                p.add(l1, BorderLayout.WEST);

                JLabel l2 = new JLabel( pt1 + "200" + pt2 + "200" + pt3 );
                p.add(l2, BorderLayout.CENTER);

                JOptionPane.showMessageDialog(null, p);
            }
        };
        SwingUtilities.invokeLater(r);
    }
}

La soluzione descritta in FixedWidthLabel, utilizzando <html><body width="..." richiederà il programmatore di fornire il messaggio come parte della stringa HTML.

Se il messaggio è qualcosa di simile invalid integer: i<0 not allowed, poi il < dovrà essere sfuggito (codificato?), altrimenti non si sa come JLabel interpreterà il codice html.

Questo aggiunge complessità a questa soluzione.

Solo se si sa che il messaggio non contiene tali caratteri, sarete allright.

Beh, forse se si conosce la larghezza è possibile eseguire alcuni test e capire come un'ampia ogni carattere di testo è, in questo modo è possibile utilizzare un ciclo per determinare il numero di caratteri stare su ogni riga e totale i caratteri che devono essere mostrato, allora si potrebbe impostare l'altezza in base a quante linee ci sono di essere.

Di 'il testo, dispone di 1000 caratteri spazi compresi, e la larghezza di un carattere è equivalente a 4pixels, allora si può capire se la larghezza è di 400 che 100 caratteri stare su ogni riga, in seguito avrete bisogno di 10 linee. Ora dire l'altezza è di 10 per la dimensione del carattere, ora sai che hai bisogno di 10 x 10 == 100 pixel, in modo che il TextArea dovrebbe essere 400x100

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top