Я использую JTextPane в качестве средства визуализации ячеек в моей таблице (поэтому я могу легко контролировать цвет, шрифт, размер и ссылки).
проблема в том, что строки оборачиваются, когда ячейка становится слишком маленькой, чтобы содержать полный текст.
Я знаю количество ожидаемых строк текста заранее (или я могу просто посчитать), поэтому я соответствующим образом установил высоту строки.
как мне получить линии для обрезки (визуально! Т.е. в середине буквы) в конце ячейки?
спасибо, asaf :-)
больше информации: Я пробовал два решения, которые я нашел в сети. тот, который устанавливает мой собственный EditroKit
, другое перечислено ниже и включает переопределение setSize ().
увы, никто не работал ...
вот мой рендерер (извиняюсь за испорченный отступ ...):
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;
}
}