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:
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.
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
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 .
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:
JFrame
sichtbar ist, weil wir möglicherweise nicht die richtige Schriftart vor 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 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
Änderungen:
setSize()
in getTableCellRendererComponent()
, da das Objekt sonst nicht korrekt umbrochen werden kann preferedSize
entsprechend der Position des letzten Zeichens 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:
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 .
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:
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:
Und Sie können die ganze Zeichenfolge lesen.
Ausgabe