Zeilenumbruch in einer JTable

dl9hda

Mitglied
Hallo, ich habe eine simple Tabelle angelegt. Es sind fünf Spalten mit Strings. Nichts besonderes. Nun möchte ich gerne, wenn die Spalten aufgrund des Textes sehr breit sind, diese verschieben und dabei soll ein Zeilenumbruch durchgeführt werden und die Zeilenhöhe entsprechend angepasst werden.

Ich habe diese Seite gefunden. https://stackoverflow.com/questions/37768335/how-to-word-wrap-inside-a-jtable-row

Es geht um den Beitrag 7 mit dem grünen Haken. Das funktioniert genau so, wie ich es möchte. Aber: Es funktioniert nur bei einer Spalte. Und zwar bei derjenigen, die als letztes im Code steht. Und das verstehe ich nicht.

table.getColumnModel().getColumn(0).setCellRenderer(new WordWrapCellRenderer());

Dann klappt das mit der ersten Spalte ausgezeichnet.

table.getColumnModel().getColumn(0).setCellRenderer(new WordWrapCellRenderer());
table.getColumnModel().getColumn(1).setCellRenderer(new WordWrapCellRenderer());

Dann funktioniert das nur noch mit der Spalte zwei. Spalte 1 führt keinen Umbruch durch. Tausche ich die Spalten, dann geht es mit Spalte 1 und mit der zweiten nicht mehr ....

Kann mir jemand einen Tipp geben, wie ich den Zeilenumbruch in allen Spalten bekommen kann?



Gruß
Holger
 

mihe7

Top Contributor
Funktioniert doch einwandfrei.
Java:
import java.awt.Component;
import javax.swing.*;
import javax.swing.table.*;

public class Test {

    static String LOREM = 
            "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, " +
            "sed diam nonumy eirmod tempor invidunt ut labore et dolore " +
            "magna aliquyam erat, sed diam voluptua. At vero eos et " +
            "accusam et justo duo dolores et ea rebum. Stet clita kasd " +
            "gubergren, no sea takimata sanctus est Lorem ipsum dolor " +
            "sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing " +
            "elitr, sed diam nonumy eirmod tempor invidunt ut labore et " +
            "dolore magna aliquyam erat, sed diam voluptua. At vero eos " +
            "et accusam et justo duo dolores et ea rebum. Stet clita kasd " +
            "gubergren, no sea takimata sanctus est Lorem ipsum dolor sit";

    static class WordWrapCellRenderer extends JTextArea implements TableCellRenderer {
        WordWrapCellRenderer() {
            setLineWrap(true);
            setWrapStyleWord(true);
        }

        public Component getTableCellRendererComponent(JTable table, Object value, 
                    boolean isSelected, boolean hasFocus, int row, int column) {
            setText(value.toString());
            setSize(table.getColumnModel().getColumn(column).getWidth(), getPreferredSize().height);
            if (table.getRowHeight(row) != getPreferredSize().height) {
                table.setRowHeight(row, getPreferredSize().height);
            }
            return this;
        }
    }

    public void run() {
        JTable table = new JTable(new Object[][] {
                {LOREM, LOREM, LOREM},
                {LOREM, LOREM, LOREM},
                {LOREM, LOREM, LOREM}
            }, new Object[]{"A","B","C"});
            
        table.getColumnModel().getColumn(0).setCellRenderer(new WordWrapCellRenderer());
        table.getColumnModel().getColumn(1).setCellRenderer(new WordWrapCellRenderer());
        
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.add(new JScrollPane(table));
        frame.setSize(800, 600);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> new Test().run());
    }
}
 

dl9hda

Mitglied
Hallo, tatsächlich nicht. Ich habe es mir noch einmal angeschaut. exakt Dein Beispiel. Wenn ich Zwischen B und C anfasse und dann Spalte B nach links ziehe, dann wird Spalte B größer und der ganze Text bleibt sichbar. Also am Ende sehe ich immer "dolor sit". Mache ich Spalte B kleiner (also nach rechts ziehen), dann wird die Spalte schmaler und immer höher. Alles bleibt aber sichtbar.

Ich fasse zwischen Spalte B und C und ziehe nach rechts. B wird größer. Aber bei A fehlt mir nun Text.

Ich möchte gerne, dass auch die anderen Spalten angepasst werden.

Gruß
Holger
 

mihe7

Top Contributor
Verstehe. Das dürfte hieran liegen
Java:
            if (table.getRowHeight(row) != getPreferredSize().height) {
                table.setRowHeight(row, getPreferredSize().height);
            }
Änder das mal zu
Java:
            int rowHeight = table.getRowHeight(row);
            int prefHeight = getPreferredSize().height;
            if (rowHeight != prefHeight && (column == 0 || rowHeight < prefHeight)) {
                    table.setRowHeight(row, prefHeight);
                }
            }
Wenn die JTable die Spalten von links nach rechts darstellt (wovon auszugehen ist), dann wird jetzt die Höhe der ersten Spalte "als Basis" verwendet und nur dann angepasst, wenn eine andere Spalte höher ist... könnte funktionieren.
 

dl9hda

Mitglied
Hallo, vielen Dank! Jetzt läuft es. Ich habe aber noch ein kleines Problem. Und zwar möchte ich gerne, dass die Zeile in der ich klicke, rot umrandet wird. Das funktioniert auch aber der WordWrapCellRenderer kommt mir da in die Quere. Ich habe das "Problem" mal angefügt. Ich habe im Grunde nur das Befüllen der Tabelle abgeändert und prepareRenderer hinzugefügt. Klicke ich jetzt etwas herum oder ändere die Größe des Fensters oder maches sonst etwas, werden auf einmal alle Zellen rot umrandet.

Holger


Code:
import java.awt.Color;
import java.awt.Component;
import javax.swing.*;
import javax.swing.border.Border;
import javax.swing.border.CompoundBorder;
import javax.swing.border.EmptyBorder;
import javax.swing.border.MatteBorder;
import javax.swing.table.*;

public class Test {

    static String LOREM = 
            "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, " +
            "sed diam nonumy eirmod tempor invidunt ut labore et dolore " +
            "magna aliquyam erat, sed diam voluptua. At vero eos et " +
            "accusam et justo duo dolores et ea rebum. Stet clita kasd " +
            "gubergren, no sea takimata sanctus est Lorem ipsum dolor " +
            "sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing " +
            "elitr, sed diam nonumy eirmod tempor invidunt ut labore et " +
            "dolore magna aliquyam erat, sed diam voluptua. At vero eos " +
            "et accusam et justo duo dolores et ea rebum. Stet clita kasd " +
            "gubergren, no sea takimata sanctus est Lorem ipsum dolor sit";

    static class WordWrapCellRenderer extends JTextArea implements TableCellRenderer {
        WordWrapCellRenderer() {
            setLineWrap(true);
            setWrapStyleWord(true);
        }

        public Component getTableCellRendererComponent(JTable table, Object value, 
                    boolean isSelected, boolean hasFocus, int row, int column) {
            setText(value.toString());
            setSize(table.getColumnModel().getColumn(column).getWidth(), getPreferredSize().height);
            int rowHeight = table.getRowHeight(row);
            int prefHeight = getPreferredSize().height;
            
            if (rowHeight != prefHeight && (column == 0 || rowHeight < prefHeight))
            {
                    table.setRowHeight(row, prefHeight);
            }
            return this;
        }
    }

    public void run() {
        
        String[] columnNames = new String[3];        
        columnNames[0] = "A";
        columnNames[1] = "B";
        columnNames[2] = "C";

        Object[][] data = null;
        
        data = new Object[3] [3];
        
        data [0] [0] = LOREM;
        data [1] [0] = LOREM;
        data [2] [0] = LOREM;
        data [0] [1] = LOREM;
        data [1] [1] = LOREM;
        data [2] [1] = LOREM;
        data [0] [2] = LOREM;
        data [1] [2] = LOREM;
        data [2] [2] = LOREM;
        
        
        DefaultTableModel model = new DefaultTableModel(data, columnNames);
        
        JTable table = new JTable(model)
        {
            private static final long serialVersionUID = 1L;
            private Border outside = new MatteBorder(1, 0, 1, 0, Color.RED);
            private Border inside = new EmptyBorder(0, 1, 0, 1);
            private Border highlight = new CompoundBorder(outside, inside);
                                               
            public Component prepareRenderer(TableCellRenderer renderer, int row, int column)
            {
                Component c = super.prepareRenderer(renderer, row, column);
                JComponent jc = (JComponent) c;
                
                //Add a border to the selected row
                if (isRowSelected(row))    jc.setBorder( highlight );
                
                return c;
            }
        };
            
        table.getColumnModel().getColumn(0).setCellRenderer(new WordWrapCellRenderer());
        table.getColumnModel().getColumn(1).setCellRenderer(new WordWrapCellRenderer());
        
        JScrollPane scrollPane = new JScrollPane(table);
        
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.add(scrollPane);
        frame.setSize(800, 600);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> new Test().run());
    }
}
 
Zuletzt bearbeitet:

mihe7

Top Contributor
Du musst den Border wieder zurücksetzen, wenn es sich nicht um die ausgewählte Zeile handelt. Die Komponente existiert nur einmal und wird wie ein Stempel für alle Zellen verwendet. Wenn Du die Farbe änderst, bleibt das ggf. bis zur nächsten Änderung.
 

dl9hda

Mitglied
Hallo, so sieht es nun aus und funktioniert ;-)

Code:
if (isRowSelected(row)) jc.setBorder( highlight );
else jc.setBorder(new LineBorder(Color.BLACK,0));
 

dl9hda

Mitglied
Hallo, mir wurde hier vor einiger Zeit schon einmal wunderbar geholfen. Leider musste mein Projekt ruhen aber nun geht es weiter.

Ich habe eine jTable, mit wechselnden Hintergründen. Wenn ich nun ein eine Zelle klicke, dann erscheint ein roter Rand und die Zelle wird dunkler hinterlegt. Weiter habe ich zwei Spalten mit Zeilenumbruch.

Wenn ich nun in eine Zelle klicke, dann wird in den beiden Spalten mit Zeilenumbruch die Farbänderung nicht richtig übernommen. Der rote Rahmen ist da, aber die beiden jeweiligen wordwrap Zellen verändern sich farblich nicht so wie sie sollen. Klicke ich auf eine Zeile mit weiß, dann wird die alternierende Farbe angezeigt, klicke ich auf eine Zelle mit der Alternativ-Farbe, dann wird weiß angezeigt. Auf dem angefügten Bild habe ich auf eine weiße Zeile geklickt. Wie bekomme ich es hin, dass die beiden Spalten auch so hinterlegt werden wie ganz links und rechts?

Holger
 

Anhänge

  • jtable.PNG
    jtable.PNG
    31,5 KB · Aufrufe: 4
Ähnliche Java Themen
  Titel Forum Antworten Datum
W Swing JTable Zeilenumbruch innerhalb einer Zelle AWT, Swing, JavaFX & SWT 3
D Zeilenumbruch in einer JTable AWT, Swing, JavaFX & SWT 3
G JTable Zeilenumbruch innerhalb einer Zelle bzw. columnHeader AWT, Swing, JavaFX & SWT 1
G Zeilenumbruch in einer SWT TableItem AWT, Swing, JavaFX & SWT 1
M Swing Cell Renderer für Zeilenumbruch in JTable AWT, Swing, JavaFX & SWT 0
M Dynamische Zellengröße und Zeilenumbruch AWT, Swing, JavaFX & SWT 7
T JTextPane ignoriert HTML Zeilenumbruch <br> tag wegen eigenem HTMLEditorKit AWT, Swing, JavaFX & SWT 5
E JavaFX TableView mit Zeilenumbruch in Zellen AWT, Swing, JavaFX & SWT 5
X JTextPane automatischer Zeilenumbruch IM Wort AWT, Swing, JavaFX & SWT 2
S Swing Warum funktioniert der automatische Zeilenumbruch mit arabischen Zeichen beim JTextPane nicht AWT, Swing, JavaFX & SWT 3
S Swing Automatischer Zeilenumbruch bei JTextPanes AWT, Swing, JavaFX & SWT 2
A Zeilenumbruch per button AWT, Swing, JavaFX & SWT 5
S Zeilenumbruch jTextArea mit toString AWT, Swing, JavaFX & SWT 2
S Swing Zeilenumbruch in JTable Zellen AWT, Swing, JavaFX & SWT 3
R JavaFX Automatischer Zeilenumbruch in Text AWT, Swing, JavaFX & SWT 13
B SWT Text - zeilenumbruch AWT, Swing, JavaFX & SWT 2
N Swing JTree TreeCellRenderer mit html und automatischen Zeilenumbruch AWT, Swing, JavaFX & SWT 8
T Nimbus JButton: Zeilenumbruch korrigieren? AWT, Swing, JavaFX & SWT 9
B Swing JEditorPane ohne Zeilenumbruch nach InputStream AWT, Swing, JavaFX & SWT 2
B Swing Zeilenumbruch in Graphics AWT, Swing, JavaFX & SWT 20
O JOptionPane.showMessageDialog mit automatischem Zeilenumbruch AWT, Swing, JavaFX & SWT 9
F Jgrid Zeilenumbruch AWT, Swing, JavaFX & SWT 10
GianaSisters Swing JTable Zellen intelligenter Zeilenumbruch AWT, Swing, JavaFX & SWT 4
C Zeilenumbruch von JTextPane wird nicht erkannt AWT, Swing, JavaFX & SWT 2
Zettelkasten drawString() Zeilenumbruch AWT, Swing, JavaFX & SWT 2
P LayoutManager Zeilenumbruch im Panel AWT, Swing, JavaFX & SWT 6
N Swing JTable - Problem mit Zeilenumbruch AWT, Swing, JavaFX & SWT 6
Spot84 swt label zeilenumbruch will nicht funktionieren AWT, Swing, JavaFX & SWT 1
H SWT Zeilenumbruch in List AWT, Swing, JavaFX & SWT 9
K Swing jTextPane zeilenumbruch AWT, Swing, JavaFX & SWT 2
S Swing jTextPaine kein Zeilenumbruch nach setText() AWT, Swing, JavaFX & SWT 9
S Zeilenumbruch in MsgBox AWT, Swing, JavaFX & SWT 13
eskimo328 JTable Zeilenumbruch im Header AWT, Swing, JavaFX & SWT 2
A JLabel und Zeilenumbruch - Nicht das Übliche AWT, Swing, JavaFX & SWT 4
G Buttonbeschreibung mit Zeilenumbruch AWT, Swing, JavaFX & SWT 3
D Toolbars und Zeilenumbruch (benutze FlowLayout) AWT, Swing, JavaFX & SWT 2
M Zeilenumbruch bei MessageFormat gesucht AWT, Swing, JavaFX & SWT 10
G Tooltip Zeilenumbruch AWT, Swing, JavaFX & SWT 13
7 Zeilenumbruch in Textfeld AWT, Swing, JavaFX & SWT 3
M JLabel Zeilenumbruch AWT, Swing, JavaFX & SWT 10
M setLineWrap() + echten Zeilenumbruch AWT, Swing, JavaFX & SWT 4
I Automatischer Zeilenumbruch in JTextArea? AWT, Swing, JavaFX & SWT 5
G JEditorPane Zeilenumbruch verhindern AWT, Swing, JavaFX & SWT 2
G JLabel mit Zeilenumbruch AWT, Swing, JavaFX & SWT 6
G Fehleranzeige im Textfeld bei Zeilenumbruch AWT, Swing, JavaFX & SWT 4
S JLabel zeilenumbruch ? geht das in JDialog? AWT, Swing, JavaFX & SWT 2
O Zeilenumbruch erzwingen (FlowLayout? AWT, Swing, JavaFX & SWT 1
A Automatischen Zeilenumbruch AWT, Swing, JavaFX & SWT 5
R JTree: Zeilenumbruch in Node AWT, Swing, JavaFX & SWT 6
G Zeilenumbruch nach n Zeichen in JTextArea AWT, Swing, JavaFX & SWT 24
P TextArea zeilenumbruch AWT, Swing, JavaFX & SWT 7
T Zeilenumbruch auf JButton AWT, Swing, JavaFX & SWT 6
M JTextPane - Zeilenumbruch verhindern stoppen deaktivieren :) AWT, Swing, JavaFX & SWT 5
T JTable, Zeilenumbruch in Zellen AWT, Swing, JavaFX & SWT 23
C Zeilenumbruch in einem JTextPane nach einem vorgegebenen cm AWT, Swing, JavaFX & SWT 2
M Jeditorpane + zeilenumbruch AWT, Swing, JavaFX & SWT 2
M Zeilenumbruch beim JLabel AWT, Swing, JavaFX & SWT 3
N JTextArea Zeilenumbruch erzwingen AWT, Swing, JavaFX & SWT 2
D [SWT] Zeilenumbruch für Tabelle AWT, Swing, JavaFX & SWT 4
R Zeilenumbruch in JTable AWT, Swing, JavaFX & SWT 2
bernd Zeilenumbruch in JEditorPane AWT, Swing, JavaFX & SWT 10
E Zeilenumbruch in einem AWT TextField AWT, Swing, JavaFX & SWT 2
R JTextPane: Zeilenumbruch AWT, Swing, JavaFX & SWT 3
bummerland ein zeichen nach einem zeilenumbruch einfügen AWT, Swing, JavaFX & SWT 4
MiMa Optimieren einer Methode zum Zentrieren von Fenstern AWT, Swing, JavaFX & SWT 0
T VerifyListener - Ersetzen einer 0 AWT, Swing, JavaFX & SWT 5
I JavaFX JavaFx-Anwendung für die Erstellung einer Windows-Anwendung? AWT, Swing, JavaFX & SWT 6
J Drag und drop aus einer JTable - bitte um Unterstützung AWT, Swing, JavaFX & SWT 2
N Dropshadow setzen bei einer Gruppe von Tiles, die sich jeweils in einer Stackpane befinden, welche in einer Gridpane angeordnet sind. AWT, Swing, JavaFX & SWT 0
M Daten zufällig Einlesen aus einer Datei (binäres Format) AWT, Swing, JavaFX & SWT 7
ExceptionOfExpectation Mit einer laufenden GUI Applikation eine Datei in dem Rechner löschen AWT, Swing, JavaFX & SWT 2
Jose05 Aus einer normalen Java Klasse eine FXML-Klasse laden AWT, Swing, JavaFX & SWT 12
Linjutsu Den Inhalten aus einer ArrayList Bilder zuweisen (Kartenspiel) AWT, Swing, JavaFX & SWT 8
H JavaFX Timeline II: Verschieben einer ImageView AWT, Swing, JavaFX & SWT 16
I Hilfe bei dem Erstellen einer SQL Abfrage aus gewählten JComboBoxen AWT, Swing, JavaFX & SWT 5
L Swing TextPanel Schrift untereinander und auf einer Höhe AWT, Swing, JavaFX & SWT 3
mananana Mögliche probleme die in einer GUI passieren Können AWT, Swing, JavaFX & SWT 6
I JTable mit einem Button zu einer Detail Seite springen AWT, Swing, JavaFX & SWT 4
Ernesto95 JavaFX Return Value nach Beendigung einer Animation AWT, Swing, JavaFX & SWT 15
melaniemueller Wortliste in einer Datei ablegen AWT, Swing, JavaFX & SWT 12
D Layout einer scene mit ListView Elementen und Zwei Textfeldern AWT, Swing, JavaFX & SWT 1
Jose05 JavaFx Fxml: GUI aus einer anderen Klasse starten AWT, Swing, JavaFX & SWT 1
U Was genau ist das Objekt einer affinentransformation? AWT, Swing, JavaFX & SWT 1
B JavaFX Prüfen ob ein Objekt sich mehrmals in einer Liste befindet AWT, Swing, JavaFX & SWT 5
mac2010 JavaFX Einbindung einer Karte AWT, Swing, JavaFX & SWT 1
donnico2 Objekte in der GUI ausgeben mit Hilfe einer DAO AWT, Swing, JavaFX & SWT 1
Kohl Jedes Objekt einer JTable um ein Zeichen verkürzen AWT, Swing, JavaFX & SWT 7
W Aufrufen einer bestimmten Scene mit if-Bedingung AWT, Swing, JavaFX & SWT 4
J Ablaufsteuerung/Anleitung machen mit JDialog und einer Zustandsmaschine AWT, Swing, JavaFX & SWT 1
missy72 JavaFX Wiederholen einer IF-Abfrage beim erneuten Öffnen einer Stage AWT, Swing, JavaFX & SWT 11
missy72 JavaFX TableView / TableColumn / ObservableList / zwei Werte in einer Zelle AWT, Swing, JavaFX & SWT 2
S JavaFX - mit Listener Veränderungen in einer TableView abhören AWT, Swing, JavaFX & SWT 3
missy72 JavaFX ObservableList in einer ArrayList speichern. AWT, Swing, JavaFX & SWT 7
HoT Sortieren von ein paar Zeilen in einer Tabelle, aber nicht die ganze Tabelle AWT, Swing, JavaFX & SWT 3
kodela Swing Element einer JComboBox ausgrauen AWT, Swing, JavaFX & SWT 3
B JavaFX Farbe eines Quadrates in einer separaten Klasse ändern AWT, Swing, JavaFX & SWT 4
H Daten aus einer XML(x83-Datei) in einem JFrame anzeigen lassen AWT, Swing, JavaFX & SWT 9
N Aufruf einer anderen Klasse durch Button ActionListener AWT, Swing, JavaFX & SWT 2
N Einer TextArea ein ScrollPane hinzufügen AWT, Swing, JavaFX & SWT 8
L JavaFX Exception nach includieren einer fxml // nested controller AWT, Swing, JavaFX & SWT 1

Ähnliche Java Themen

Neue Themen


Oben