3 Stimmen

Beschneiden von Textzeilen in einem jtextpane-basierten jtable cell renderer

Ich verwende ein JTextPane als Zell-Renderer in meiner Tabelle (so kann ich Farbe, Schriftart, Größe und Links leicht steuern). Das Problem ist, dass Zeilen umbrochen werden, wenn die Zelle zu klein wird, um den gesamten Text zu enthalten.

Ich kenne die Anzahl der zu erwartenden Textzeilen im Voraus (oder ich kann einfach zählen), also stelle ich die Höhe der Zeile entsprechend ein.

Wie bringe ich die Zeilen dazu, am Ende der Zelle zuzuschneiden (visuell, d. h. in der Mitte eines Buchstabens)?

Danke, Asaf :-)

Mehr Informationen: Ich habe zwei Lösungen ausprobiert, die ich im Netz gefunden habe. mein eigenes EditroKit einstellen . die andere ist unten aufgeführt und beinhaltet die Überschreibung von setSize().
Leider hat nichts funktioniert...

hier ist mein Renderer (Entschuldigung für die verpatzte Einrückung...):

package textTable;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.FontMetrics;
import java.awt.Insets;

import javax.swing.JPanel;
import javax.swing.JTable;
import javax.swing.JTextPane;
import javax.swing.table.TableCellRenderer;
import javax.swing.text.BadLocationException;
import javax.swing.text.SimpleAttributeSet;
import javax.swing.text.StyleConstants;
import javax.swing.text.StyledDocument;

public class LogRenderer extends JPanel implements TableCellRenderer {
    static class NoWrapTextPane extends JTextPane {
        public NoWrapTextPane () {
            super();
        }
        @Override
        public boolean getScrollableTracksViewportWidth() {
            return false;
        }
        @Override
        public void setSize(Dimension d) {
            if(d.width < getParent().getSize().width) {
                d.width = getParent().getSize().width;
            }
            super.setSize(d);
        }
    }

    private JTextPane textPane = new NoWrapTextPane();//JTextPane();
    private StyledDocument doc = textPane.getStyledDocument();
    private SimpleAttributeSet attr = new SimpleAttributeSet();
    private FontMetrics fontMetrics;

    public LogRenderer() {
    textPane.setMargin(new Insets(0,0,0,0));

        fontMetrics = textPane.getFontMetrics(getFont());

        StyleConstants.setFontFamily(attr, "monospaced");//"Courier"

    setLayout(new BorderLayout());
    add(textPane,BorderLayout.CENTER);
}

public Component getTableCellRendererComponent(JTable table,
        Object value, boolean isSelected, boolean hasFocus, int row,
        int column) {
        String[] text;
        if (value != null && value instanceof String[]) {
            text = (String[]) value;
        } else {
            text = null;
        }
        try {
            doc.remove(0, doc.getLength());
            if (text != null) {
                int offset = 0;
                for (String line : text) {
                    doc.insertString(offset, line+"\n", attr);
                    offset += (line == null ? 0 : line.length()) +1;
                }
                int preferredHeight = fontMetrics.getHeight() *     text.length;
                if (preferredHeight != table.getRowHeight(row)) {
                    System.out.println("preferredHeight     "+preferredHeight+" = fontMetrics.getHeight() "+fontMetrics.getHeight()+" + text.length     "+text.length);
                    table.setRowHeight(row, preferredHeight);
                } 
            }
        } catch (BadLocationException e) {
            e.printStackTrace();
        }
//      textPane.setToolTipText("hi");
        return this;
    }   
}

3voto

trashgod Punkte 199887

Verwenden Sie eine benutzerdefinierte Renderer . Erweitern Sie JLabel sollte Ihnen Ellipsen-Symbole geben, um die Abtrennung anzuzeigen, aber Sie können auch JPanel y dieser Ansatz um das Ergebnis abzuschneiden.

Nachtrag: Die WrapEditorKit die Sie zitiert haben, funktioniert gut und scheint zu tun, was Sie wollen. In Ihrem LogRenderer Ich denke, Sie können die JEditorPane und setzen Sie den Editor im Konstruktor. Zum Beispiel:

private static class LogRenderer
    extends JEditorPane implements TableCellRenderer {

    public LogRenderer() {
        this.setEditorKit(new WrapEditorKit());
    }

    public Component getListCellRendererComponent(
        JList list, Object value, int index,
        boolean isSelected, boolean cellHasFocus) {
        this.setText((String) value);
        return this;
    }

    @Override
    public Component getTableCellRendererComponent(
        JTable table, Object value, boolean isSelected,
        boolean hasFocus, int row, int column) {
        this.setText((String) value);
        return this;
    }
}

0 Stimmen

Ich habe einen Beispielrenderer hinzugefügt, der das von Ihnen erwähnte Kit verwendet.

1 Stimmen

Es scheint, dass die Website java-sl.com offline ist (weiß jemand, was mit dieser Website passiert ist?) Ich habe eine archivierte Version bei archive.org gefunden - web.archive.org/web/20220203131713/ java-sl.com/wrap.html

1 Stimmen

@MadMike: Ich habe Ihre Archivverbindung oben.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X