Wie kann ich ein JTextArea mit einer bestimmten Breite und einer möglichst geringen Höhe den gesamten Text anzuzeigen erforderlich?

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

Frage

In allen Beispielen, dass ich, dass die Verwendung einen JTextArea finden, die Höhe und Breite ist bekannt, bevor die JTextArea Konstruktion, und wenn der JTextArea würde mehr Höhe benötigt, dann wird es im Innern eines JScrollPane setzen. Offensichtlich ist die Höhe der JTextArea abhängig von der Breite und dem Textinhalt.

Nun erfordert meine Situation, dass ich nicht mit einem JScrollPane, sondern dass der JTextArea sein gerade groß genug, um die gesamten Text anzuzeigen. Wenn ich die JTextArea schaffen, weiß ich den Textinhalt und wie viel Breite wird es an die Arbeit haben mit; Ich weiß nicht, die Höhe - ich habe das so klein wie möglich sein soll, ohne dass der Text abgeschnitten wird. Dies scheint sehr schwierig zu erreichen.

Als Randbemerkung, wird die JTextArea zu einem JPanel hinzugefügt werden, die keinen Layout-Manager hat - es nutzt die absolute Positionierung auf der Grundlage der bevorzugten Größe der Komponente hinzugefügt. Dies erfordert, dass meine JTextArea würde die richtigen Dimensionen auf getPreferredSize() zurückzukehren. Die richtigen Dimensionen sollen die Breite sein, dass ich zur Verfügung gestellt, wenn ich es gebaut, und die Mindesthöhe, die mit der vorgesehenen Breite der gesamten Text anzuzeigen.

erforderlich sind

Ich habe einige ähnliche Themen gefunden, die den Seltsamkeiten / Bugs mit dem JTextArea beteiligt diskutieren, die manchmal gelöst werden durch pack() zweimal auf den übergeordneten Container aufrufen. Dies ist keine Option für mich. Ich bin im Grunde versucht, meine eigene JTextArea zu erstellen, die eine Breite und String nimmt und berechnet die erforderliche Mindesthöhe von der Breite und Schrifteinstellungen basierte, aber ich dachte, ich würde zunächst fragen, um, bevor die Zeit zu verbringen, das zu tun.

Hoffentlich meine Frage ist klar. Vielen Dank für Ihre Hilfe!

War es hilfreich?

Lösung

  

es verwendet absolute Positionierung auf Basis der Zusatzkomponente bevorzugte Größe.

Sounds wie der Job eines Layout-Manager.

  

Dies erfordert, dass mein JTextArea die richtigen Maße auf getPreferredSize zurückkehren würde ().

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() );

Andere Tipps

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);
    }
}

Die beschriebene Lösung in FixedWidthLabel, <html><body width="..." mit die Programmierer benötigen die Nachricht als Teil des HTML-String zu liefern.

Wenn die Meldung etwas wie invalid integer: i<0 not allowed ist, dann wird der < zu entkommen (codiert?), ansonsten gibt es nicht abzusehen, wie JLabel die HTML interpretieren wird.

Dies erhöht die Komplexität dieser Lösung.

Nur wenn Sie wissen, dass die Meldung keine solche Zeichen enthält, werden Sie allright sein.

Nun vielleicht, wenn Sie wissen, Ihre Breite Sie einige Tests laufen können und Arbeit aus, wie weit jedes Zeichen des Textes ist, dass die Art und Weisen Sie eine Schleife verwenden könnten, um zu bestimmen, wie viele Zeichen pro Zeile passen und die Zeichen insgesamt, die seine gezeigt, dann könnten Sie die Höhe basierend auf festgelegt, wie viele Zeilen gibt es sein.

Sagen Sie Ihren Text hat 1.000 Zeichen einschließlich Leerzeichen und die Breite eines Zeichens zu 4pixels gleichwertig, dann können Sie aus arbeiten, wenn die Breite 400, dass 100 Zeichen pro Zeile passen, anschließend werden Sie 10 Zeilen benötigen. Jetzt sagen die Höhe 10 für die Schriftgröße ist, können Sie jetzt wissen Sie, 10 x 10 == 100 Pixel benötigen, so dass Ihr TextArea- 400x100 sein sollte

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top