当我将HTML标记组合到JLabel文本中时,我忽略了当空间太小而无法显示完整文本时显示的省略号行为.在我的特定情况下,它是一个TableCellRenderer,它扩展了JLabel(swing的默认值或其他).现在,当列宽太小而文本无法完全显示时,它不会显示省略号.
请参阅下面的图片,例如:对于左栏,我使用HTML将渲染文本包装在渲染器中:setText("<html>" + "<strong>" + value.toString() + "</strong>" + "</html>");.正如您所看到的,当列宽太小而无法包含文本时,它只是被剪切.但是,右列显示日期和时间以及使用DefaultTableCellRenderer时,如果未能包含完整文本,则显示省略号.

所以我的问题是,我可以同时拥有两个吗?意思是,用HTML包装文本仍然得到省略号?
更新:
我发现在使用HTML时没有得到省略号的原因.我跟着从代码JComponent#paintComponent(Graphics g)一路下跌到BasicLabelUI#layoutCL(...).请参阅从上一个中获取的以下代码段.如果它没有html属性,它只剪裁字符串(当标签文本用html包装时为true).但我不知道如何解决它:
v = (c != null) ? (View) c.getClientProperty("html") : null;
if (v != null) {
textR.width = Math.min(availTextWidth,
(int) v.getPreferredSpan(View.X_AXIS));
textR.height = (int) v.getPreferredSpan(View.Y_AXIS);
} else {
textR.width = SwingUtilities2.stringWidth(c, fm, text);
lsb = SwingUtilities2.getLeftSideBearing(c, fm, text);
if (lsb < 0) {
// If lsb is negative, add it to the width and later
// adjust the x location. This gives more space than is
// actually needed.
// This is done like this for two reasons:
// 1. If we set the width to the actual bounds all
// callers would have to account for negative lsb
// (pref size calculations ONLY look at width of
// textR)
// 2. You can do a drawString at the returned location
// and the text won't be clipped.
textR.width -= lsb;
}
if (textR.width > availTextWidth) {
text = SwingUtilities2.clipString(c, fm, text,
availTextWidth);
textR.width = SwingUtilities2.stringWidth(c, fm, text);
}
textR.height = fm.getHeight();
}
Run Code Online (Sandbox Code Playgroud)
小智 1
我要说:不,你不能两者兼得。
我认为如果您想要自定义样式和省略号,您必须自己完成,无需 HTML 并使用自定义 TableCellRenderer。
如果您想尝试鱼与熊掌兼得,您也许可以通过创建自己的 View 对象并使用 c.putClientProperty("html", value) 设置它来实现这一点,但我怀疑 HTML 渲染代码有没有省略的概念(文本溢出是 HTML 5ish 的一项功能),因此您必须弄清楚如何教它做到这一点。我怀疑这会非常困难,并且比仅仅编写自己的 TableCellRenderer 困难得多。
| 归档时间: |
|
| 查看次数: |
769 次 |
| 最近记录: |