Обрезка текстовых строк в jtextpane-рендерере ячеек jtable
Я использую JTextPane в качестве средства визуализации ячеек в моей таблице (так что я могу легко контролировать цвет, шрифт, размер и ссылки). проблема в том, что строки оборачиваются, когда ячейка становится слишком маленькой, чтобы содержать полный текст.
Я заранее знаю количество ожидаемых строк текста (или могу просто посчитать), поэтому я соответственно установил высоту строки.
как получить линии для обрезки (визуально! т.е. в середине буквы) в конце ячейки?
спасибо, асаф:-)
больше информации: я попробовал два решения, которые я нашел в сети. тот, который включает в себя установку моего собственного 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;
}
}
1 ответ
Используйте пользовательский рендер. простирающийся JLabel
должен дать вам символы многоточия для обозначения усечения, но вы можете использовать JPanel
и этот подход позволяет обрезать результат.
Приложение: The WrapEditorKit
то, что вы цитировали, работает хорошо и, кажется, делает то, что вы хотите. В вашем LogRenderer
Я думаю, вы можете продлить JEditorPane
и установите редактор в конструкторе. Например:
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;
}
}