Как изменить эллипсы строки клипа, используемые Swing при размещении текстовых компонентов - PullRequest
4 голосов
/ 10 августа 2010

По умолчанию Swing использует эллипсы "...", чтобы указать, что текст был усечен в JLabel и подобных текстовых компонентах.Можно ли изменить это поведение, чтобы использовать другую символьную строку, например ">"?

Просматривая код Swing, который я нашел в SwingUtilities2, метод с именем clipString (...), который появляется для жесткого кодирования строкибыть "...".

Ответы [ 2 ]

1 голос
/ 01 мая 2012

Решение, которое я использовал, выглядит следующим образом:

1) Зарегистрируйте пользовательский LabelUI

2) LabelUI переопределяет метод layoutCL () для замены эллипсов Swing на предоставленные пользователем эллипсы.

public class LabelUI extends MetalLabelUI {
    private static final int SWING_ELLIPSES_LEN = "...".length();
    private static final ComponentUI LABEL_UI_INSTANCE = new LabelUI();
    private String displayedText;
    public static ComponentUI createUI(JComponent c) {
        return LABEL_UI_INSTANCE;
    }
    public String getText() {
        return displayedText;
    }
    protected String layoutCL(JLabel label, FontMetrics fontMetrics, String text, Icon icon, Rectangle viewR, Rectangle iconR, Rectangle textR) {
        displayedText = super.layoutCL(label, fontMetrics, text, icon, viewR, iconR, textR);
        String truncationString = (String)label.getClientProperty("LabelUI.truncationString");
        if (truncationString != null && !displayedText.equals(text)) {
            displayedText = displayedText.subSequence(0, displayedText.length() - SWING_ELLIPSES_LEN) + truncationString;
        }
        return displayedText;
    }
}

3) Предоставьте новые эллипсы, установив свойство клиента для компонента.

JLabel component = ... ;
component.putClientProperty("LabelUI.truncationString", ">");
1 голос
/ 10 августа 2010

Я не уверен, что вы можете установить это в Swing. Попробуйте создать свою собственную реализацию JLabel, которая усекает строку так, как вы этого хотите.

Здесь вы можете использовать функции усечения из SwingUtilities. Вы можете начать с копирования кода с него, что обычно является хорошим началом.

Я думаю, вам нужно расширить метод paintComponent JLabel, измерить FontMetrics и определить, нужно ли усечение метки. Если это действительно установить текст в усеченное значение. Не забудьте сохранить не усеченное значение в поле или около того.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...