截取JLabel左侧的文本。

6
默认情况下,如果文本过长无法完全显示,JLabel 会在右侧使用三个点来截断文本,就像这样:enter image description here (该图像来自我正在开发的一个小型备份应用程序)。正如您所看到的,在“取消”按钮上方的最后一个 JLabel 被截断了。显然,这种行为是不可取的,因为文本的更重要部分被截断了。
我希望最终的标签看起来像这张图片中的右栏(抱歉分辨率不佳):
enter image description here 源自:Tips4Java 到目前为止,我尝试过将标签内的文本对齐方式更改为 JLabel.RIGHT,将组件方向更改为 ComponentOrientation.RIGHT_TO_LEFT,设置 horizontalTextPosition,但都没有成功。
import javax.swing.*;
import java.awt.*;

public class Backup
{
    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(()->{
            JLabel label = new JLabel("Some test text 1 2 3 4 5 6 7 8 9 10 abcdefghjiklmnopqrstuvwxyz", JLabel.RIGHT);
            label.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
            label.setHorizontalTextPosition(JLabel.RIGHT);

            JFrame frame = new JFrame();
            frame.add(label);
            frame.pack();
            frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
            frame.setVisible(true);
        });
    }
}

我也尝试使用HTML:

<html>
    <body>
        <p style="width:300px;overflow-x:hidden;direction:rtl">
            kladsjhglakjsjdghlekfalksjdvhlkjdsnkljhsdlkvjhasdkjhfslkdjhcksdjhvflkasjvhlkajdlkajvsdhvlkjsadhaaaaaaaaaaaaa
        </p>
    </body>
</html>

虽然我的浏览器可以正常运行,但swing似乎不支持足够多的样式属性来支持此行为。

编写自己的实现应该不难,以满足精确要求。不过我想知道是否有一种“swing方式”来实现这一点。


我想让最终的标签看起来像这张图片中的样子 - 这就是我要提议的。 我在想是否有一种"摇摆方式"来实现这个 - 据我所知并没有,这就是为什么为JTable创建了自定义渲染器。 否则我会在使用标签作为渲染器时采用Swing方式 :) - camickr
@camickr 嗯,我只是希望能够通过设置某些属性或类似的方式来避免编写自己的渲染器。但是在查看了JLabel的文档和代码后,我已经怀疑这一点了。无论如何,谢谢。 - user4668606
3个回答

2

这种方法不会提供前导省略号(…),但至少它简单、干净。您可以将JLabel放在JViewport中,并始终将其滚动到末尾:

JViewport viewport = new JViewport();
viewport.setView(label);
viewport.addComponentListener(new ComponentAdapter() {
    @Override
    public void componentResized(ComponentEvent event) {
        int width = viewport.getWidth();
        Dimension size = label.getPreferredSize();
        viewport.setViewPosition(new Point(size.width - width, 0));
    }
});

2
使用trashgod的出色答案(https://dev59.com/iXA65IYBdhLWcg3w2iip#3597688),这里是一个简单的BasicLabelUI实现,它创建了一个左侧省略号。
它确实使用了Apache的StringUtils.reverse(text),但仅出于方便考虑。它可以被替换为调用StringBuilder(text).reverse().toString()
static class LeftEllipsisUI extends BasicLabelUI {
    @Override
    protected String layoutCL(JLabel label, FontMetrics fontMetrics, String text, Icon icon, Rectangle viewR, Rectangle iconR, Rectangle textR) {
        return StringUtils.reverse(super.layoutCL(label, fontMetrics, StringUtils.reverse(text), icon, viewR, iconR, textR));
    }
}

简洁而优雅,最新的答案却是最好的。 - Mumrah81
这不会导致文本被反转吗? - Reto Höhener
Reto - 不,它不会。你有注意到我使用了两次reverse()吗?请尝试运行代码,你会发现它可以工作。 - Mike Viens

0

您可以添加此内容并查看它是否符合您的需求:

label.setHorizontalAlignment(SwingConstants.LEFT);

根据文档:

设置标签内容沿X轴的对齐方式。


没有帮助。将标签内容对齐到左侧不会改变溢出处理的行为。事实上,我已经尝试了每个有效的对齐值,只是为了确保。 - user4668606
通过这个,我可以看到你在代码片段中期望的输出,左对齐显示。 - ddarellis
重点不是将文本左对齐,而是如果文本超出组件的边界,则在左侧用3个点截断文本。 - user4668606
1
我的错!也许你可以看看https://dev59.com/PHjZa4cB1Zd3GeqPb0Jc - ddarellis
嗯,基本上就是创建自己的标签实现。尽管最后一个答案非常有趣。谢谢 ;) - user4668606

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接