gpt4 book ai didi

java - 在基于 jtextpane 的 jtable 单元格渲染器中裁剪文本行

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:04:23 25 4
gpt4 key购买 nike

我在我的表格中使用 JTextPane 作为单元格渲染器(因此我可以轻松控制颜色、字体、大小和链接)。问题是当单元格太小而无法包含完整文本时,行会换行。

我提前知道预期的文本行数(或者我可以数),所以我相应地设置了行的高度。

如何在单元格末尾裁剪线条(视觉上!即在字母中间)?

谢谢,asaf :-)

更多信息:我尝试了两种在网上找到的解决方案。一个涉及setting my own 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;
}
}

最佳答案

使用自定义 renderer .扩展 JLabel 应该给你省略号来指示截断,但你可以使用 JPanelthis approach让剪裁切碎结果。

附录: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;
}
}

关于java - 在基于 jtextpane 的 jtable 单元格渲染器中裁剪文本行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2139868/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com