【问题标题】:Cut off the text of a JLabel on the left剪掉左边一个JLabel的文字
【发布时间】:2017-05-15 03:11:58
【问题描述】:

默认JLabel会用3个点将右边的文字截掉,如果文字太长无法完全显示如下:

(图片来自我正在开发的一个小型备份应用程序)。如您所见,“取消”按钮上方的最后一个JLabel 在右侧被切断。这种行为显然是不可取的,因为文本中更相关的部分被截断了。

我希望得到的标签看起来像这张图片(右栏,抱歉分辨率不好):

Source

到目前为止,我已经尝试将标签中文本的对齐方式更改为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 似乎不支持足够的样式属性集来支持此行为。

编写一个自己的实现来满足精确执行此操作的要求应该不会太难。不过,我想知道是否有实现这一目标的“摇摆方式”。

【问题讨论】:

  • I'd like to look the resulting label like in this image - 这就是我要建议的。 I was wondering whether there was a "swing-way" of achieving this. - 我不知道,这就是为 JTable 创建自定义渲染器的原因。否则我会在使用标签作为渲染器时使用 Swing 方式:)
  • @camickr 好吧,我只是希望通过设置一些属性或类似的东西来编写我自己的渲染器。但是在浏览了JLabel 的文档和代码之后,我已经怀疑它了。无论如何,谢谢。

标签: java swing jlabel


【解决方案1】:

使用来自垃圾神 (https://stackoverflow.com/a/3597688/567496) 的出色答案,这里是 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));
    }
}

【讨论】:

  • 简洁优雅,最新答案但最好的一个
  • 这不会导致文本反转吗?
  • Reto - 不,它没有。,你注意到我使用了两次 reverse() 吗?请尝试该代码,您会发现它有效。
【解决方案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));
    }
});

【讨论】:

    【解决方案3】:

    你可以添加这个,看看是不是你需要的:

    label.setHorizontalAlignment(SwingConstants.LEFT);
    

    根据文档:

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

    【讨论】:

    • 没有帮助。将标签的内容向左对齐不会改变溢出处理的行为。事实上,我已经尝试了每一个有效的对齐值,只是为了确保。
    • 有了这个,我看到了你在 sn-p 中所期望的输出,左对齐。
    • 重点不是让文字靠左对齐,而是在文字超出组件边界的情况下,在左边用3个点将文字截断。
    • 我的错!也许你可以看到stackoverflow.com/questions/19519940/…
    • 好吧,这基本上可以归结为创建自己的标签实现。虽然最后一个答案很有趣。谢谢;)
    猜你喜欢
    • 2012-01-24
    • 2023-02-01
    • 2016-09-03
    • 1970-01-01
    • 2011-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多