JLabel: Измучить текст, если он не подходит - PullRequest
0 голосов
/ 23 ноября 2018

У меня есть JLabels в ограниченном пространстве (JTable), и когда текст внутри метки слишком длинный, он усекается.Есть ли способ сделать текст вписанным в выделенное пространство только горизонтальным сдавливанием?

См. Верхнюю метку в этих примерах:

enter image description here

Текст отформатирован в HTML, поэтому я не могу просто нарисовать строку в пользовательском компоненте JPanel.Значок отсутствует.

Поскольку я решил этот вопрос при наборе текста, в соответствии с meta Я поделюсь с вами ответом.

1 Ответ

0 голосов
/ 23 ноября 2018

Я установил это в качестве пользовательского интерфейса для JLabel:

Он переводит текст в изображение вне экрана, а затем изменяет размеры этого изображения в пропорции JLabel.

[Редактировать] Это ненеправильно работают с прозрачными метками или метками с пустым текстом HTML.

// Copied and modified from BasicLabelUI
private static class SquishLabelUI extends BasicLabelUI {
    private final Rectangle paintIconR = new Rectangle();
    private final Rectangle paintTextR = new Rectangle();

    private String layout(JLabel label, FontMetrics fm, int width, int height) {
        Insets insets = label.getInsets(null);
        String text   = label.getText();
        Rectangle paintViewR = new Rectangle(insets.left,
                                             insets.top,
                                             width - (insets.left + insets.right),
                                             height - (insets.top + insets.bottom));
        paintIconR.setBounds(0, 0, 0, 0);
        paintTextR.setBounds(0, 0, 0, 0);
        return layoutCL(label, fm, text, null, paintViewR, paintIconR, paintTextR);
    }

    @Override
    public void paint(Graphics g, JComponent c) {
        JLabel label = (JLabel)c;

        layout(label, SwingUtilities2.getFontMetrics(label, g), c.getWidth(), c.getHeight());

        View v = (View)c.getClientProperty(BasicHTML.propertyKey);

        Dimension size = getPreferredSize(label);
        BufferedImage img = label.getGraphicsConfiguration()
                                 .createCompatibleImage(size.width, size.height, TRANSLUCENT);

        Graphics2D g2 = img.createGraphics();
        try {
            g2.setColor(label.getBackground());
            g2.setClip(0, 0, size.width, size.height);
            g2.fillRect(0, 0, size.width, size.height);
            v.paint(g2, new Rectangle(0, 0, size.width, size.height));
            int renderWidth = Math.min(size.width, paintTextR.width);
            Image img2 = img.getScaledInstance(renderWidth, paintTextR.height, Image.SCALE_SMOOTH);
            g.drawImage(img2, paintTextR.x, paintTextR.y, null);
        } finally {
            g2.dispose();
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...