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