So legen Sie die RowHeight dynamisch in einer JTable fest

7

Ich möchte einen String in ein JTable einfügen, der länger als die angegebene Zellenbreite ist. Wie kann ich rowHeight dynamisch setzen, damit ich den gesamten String lesen kann? Hier ist ein Beispiel:

%Vor%

Und hier sehen Sie den Code, mit dem jeder Text unterbrochen wird, der für die angegebene Zelle lang ist

%Vor%

Danke, aber ich möchte die RowHeight dynamisch implementieren, abhängig von der Stringlänge ... Ich möchte den gesamten String / Text in der Zelle lesen. irgendwelche Vorschläge?

Ich bin Java-Anfänger und das ist meine erste Frage. Ich würde mich freuen, wenn ich eine Antwort bekomme.

    
Ramses 12.02.2014, 08:58
quelle

5 Antworten

12

Es gibt mehrere Probleme bei der Verwendung eines JTextArea als Rendering-Komponente (und die meisten, wenn nicht alle von ihnen bereits in mehreren QA auf dieser Website erklärt). Versuchen sie zusammenzufassen:

Passen Sie die individuelle Zeilenhöhe an die Größenanforderungen der Rendering-Komponente an

Im Grunde geht es darum, die Zellen nach Bedarf durchzuschleifen, dann

  • Konfigurieren Sie den Renderer mit den Daten
  • fragen Sie die Wiedergabekomponente nach ihrer bevorzugten Größe
  • Setzen Sie die Höhe der Tabellenzeile auf die gewünschte Höhe

Die updateRowHeight-Methode in der bearbeiteten Frage des OP ist in Ordnung.

JTextAreas Berechnung seiner preferredSize

Um einen vernünftigen Dimensionierungshinweis für eine Dimension zu erhalten, muss er mit einer angemessenen Größe in der anderen Dimension "ausgesät" werden. Das heißt, wenn wir die Höhe benötigen, braucht es eine Breite, und das muss bei jedem Aufruf getan werden. Im Kontext einer Tabelle ist eine angemessene Breite die aktuelle Spaltenbreite:

%Vor%

Dynamische Anpassung der Höhe

Die Zeilenhöhe, die in einem stabilen Zustand der Tabelle / Spalte / des Modells vollständig bestimmt wurde. Also setzen Sie es (Aufruf updateRowHeight) einmal nach Abschluss der Initialisierung und wann immer der Status geändert wird, von dem er abhängt.

%Vor%

Hinweis

Als allgemeine Regel gilt, dass alle Parameter in der getXXRendererComponent ausschließlich schreibgeschützt sind. Implementierungen dürfen nicht einen Zustand des Aufrufers ändern. Das Aktualisieren der Zeilenhöhe innerhalb des Renderers ist falsch .

    
kleopatra 15.02.2014, 11:44
quelle
5

Viele gute Ideen sind in anderen Antworten und auch in den damit verbundenen Fragen verknüpft.

Hier ist also, wie ich Ihre Klassen geändert habe, um eine Tabelle mit voll funktionierenden Auto-Line-Höhen zu erhalten:

%Vor%

Wichtige Änderungen:

  • Berechne die Höhe erst, nachdem JFrame sichtbar ist, weil wir möglicherweise nicht die richtige Schriftart vor
  • haben
  • ändere rowHeight nur vom event-dispatch-thread ( SwingUtilities.isEventDispatchThread() / SwingUtilities.invokeLater() ); Andernfalls könnte die Tabelle unserem RowHeightCellRenderer andere Werte zuweisen, während wir uns mitten in der Berechnung der Höhe befinden
  • initiiere rowHeight auf 20, damit wir wieder verkleinern können
  • TableColumnModelListener , also wissen wir, wenn der Benutzer die Größe einer Spalte ändert und rowHeight s verkleinert oder vergrößert (Sie können den Listener sicher entfernen, wenn dies unerwünscht ist)

Auch jetzt bewerte ich nur geänderte Zeilen für TableModel Änderungen

%Vor%

Änderungen:

  • setSize() in getTableCellRendererComponent() , da das Objekt sonst nicht korrekt umbrochen werden kann
  • Berechne preferedSize entsprechend der Position des letzten Zeichens
TheConstructor 16.02.2014 02:30
quelle
2

Tatsächlich implementiert JTextArea bereits alle Funktionen, die erforderlich sind, um seine Höhe basierend auf seiner Breite dynamisch zu ändern. Man kann diese Funktionalität in Aktion sehen, wenn JTextArea in einem ScrollPane verwendet wird, dessen Höhe automatisch an die Breite von ScrollPane angepasst wird. Um diese Funktion verwenden zu können, muss zuerst die Größe der JTextArea auf eine bestimmte Breite eingestellt werden. Anschließend gibt JTextArea # getPreferredSize () die erforderliche Höhe zurück, um den Text anzuzeigen (wenn Zeilenumbruch auf "true" gesetzt ist).

Um die Zeilenhöhe einer JTable basierend auf ihrer Breite dynamisch zu ändern, kann man Folgendes tun:

  1. Fügen Sie der Tabelle, die eine JTextArea in TableCellRenderer # getTableCellRendererComponent ()
  2. zurückgibt, einen benutzerdefinierten TableCellRenderer hinzu
  3. Hören Sie sich die Größenänderung der Spalten an, wie hier erklärt: Java JTable Spalte erkennen, die vom Benutzer erneut skaliert wurde
  4. Aktualisieren Sie die Zeilenhöhen der Spalten wie folgt: Passen Sie die Höhe der Zeilen in einer JTable automatisch an
  5. Während der Aktualisierung der Zeilenhöhen berechnet man die erforderliche Größe der JTextArea, indem man zuerst die neue Breite einstellt und dann die bevorzugte Höhe erhält, wie im folgenden Codeausschnitt
  6. gezeigt

Aktualisierungsfunktion der Zeilenhöhen:

%Vor%

Bei diesem Ansatz sind keine weiteren Berechnungen von Spalten oder Zeilen erforderlich.

Hier ist der vollständige Code der Beispieltabelle des OPs, angepasst an diese Implementierung.

%Vor%

Beachten Sie, dass ich einen Teil des Codes aus Java erneut verwendete und änderte JTable erkennt Spalte, die vom Benutzer neu skaliert wurde und Auto Passen Sie die Höhe der Zeilen in einer JTable an .

    
Balder 15.02.2014 12:13
quelle
0

Normalerweise setzen wir RowHeight , wenn der Text in row über den height einer Zeile hinausgeht, um die Höhe einer Zeile festzulegen, tun wir das:

%Vor%
  

Ich möchte eine Zeichenfolge in eine JTable einfügen, die länger ist als die angegebene Zellenbreite . Wie kann ich rowHeight dynamisch so einstellen, dass ich den ganzen String lesen kann?

Um den vollständigen String aus der Zeile jtable zu lesen, müssen Sie RowHeight nicht einstellen. Sie müssen den PreferredWidth eines column so einstellen, wie Sie es bereits tun. Fügen Sie einfach eine Zeile wie folgt hinzu:

%Vor%

Und Sie können die ganze Zeichenfolge lesen.

Ausgabe

    
Aarav 12.02.2014 09:00
quelle
0

Ich finde es am einfachsten, die Zeilenhöhe innerhalb des Component-Renderers wie folgt anzupassen:

%Vor%

Dies funktioniert auch für einen Renderer, der JTextPane zurückgibt.

    
nedmund 04.08.2017 11:30
quelle

Tags und Links