Обтекание текстом JLabels без предпочтительного / максимального / минимального размера - PullRequest
0 голосов
/ 14 мая 2011

Я использую JLabels в качестве гиперссылок.Я хочу, чтобы они выглядели и функционировали точно так же, как ссылки в браузере, поэтому использование текстовых панелей / панелей редактора и т. Д. Нежелательно.Проблема в том, что многие контейнеры, в которые будут помещены эти ссылки, не имеют указанного размера: они зависят от размера своих родителей (или даже бабушек и дедушек).

Я использую ящики для макетов,и если текст ссылки занимает более чем две трети ширины блока, содержимое блока начинает выходить за пределы реальных границ блока (так что, если этот блок был окружен JScrollPane, появится горизонтальная полоса прокрутки).

Есть ли какой-нибудь способ принудительного переноса на JLabel?Во многих постах, которые я прочитал, говорится, что размещение текста в тегах HTML приведет к автоматическому переносу текста при необходимости, но независимо от того, что я делаю, я не могу заставить это работать.Я не могу использовать теги <br />, потому что я не знаю точно, куда они пойдут, если это не может быть автоматизировано, например:

if(text.length() > wrapLength)
{
    //break the text into substrings and insert a <br /> at wrapLength
    //the difficulty is in figuring out the value of wrapLength
}

Вот код для класса гиперссылки:

import java.awt.Color;
import java.awt.Desktop;
import java.awt.Font;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import javax.swing.JLabel;

public class Hyperlink extends JLabel
{
    private URI uri;
    private String baseText;

    public Hyperlink(String text, String uri, Font font, Color textColor)
    {
        super(text);
        baseText = text;
        setFont(font);
        setForeground(textColor);
        setOpaque(false);

        if(Desktop.isDesktopSupported())
        {
            try
            {
                setToolTipText(uri);
                this.uri = new URI(uri);
                addMouseListener(new LinkMouseListener());
            }
            catch(URISyntaxException ex)
            {
            }
        }
    }

    private class LinkMouseListener extends MouseAdapter
    {
        @Override
        public void mouseClicked(MouseEvent e)
        {
            Desktop desktop = Desktop.getDesktop();
            try
            {
                desktop.browse(uri);
            }
            catch(IOException ioe)
            {
                System.out.println("Something went wrong..."); //DELETE
            }
        }

        @Override
        public void mouseEntered(MouseEvent e)
        {
            setText("<html><u>" + baseText + "</u></html>");
        }

        @Override
        public void mouseExited(MouseEvent e)
        {
            setText(baseText);
        }
    }
}

Ответы [ 2 ]

2 голосов
/ 14 мая 2011

На этикетке попробуйте setPreferredSize(new Dimension(width, height)), setSize(new Dimension(width, height)) или setMaximumSize(new Dimension(width, height)) и установите ширину, равную ширине, которую вы хотите обернуть. Я думаю, в вашем случае это будет setMaximumSize (...).

Он не переносится автоматически из-за вашего менеджера компоновки. Некоторые менеджеры по расположению игнорируют предпочтительный размер или другие размеры. В вашем случае вам, вероятно, просто нужно поиграться с различными методами setXXXSize () и найти тот, который уважает ваш менеджер компоновки.

Чтобы получить предпочтительную ширину, вам нужно получить ширину от одного из родителей. Еще раз, в зависимости от менеджера компоновки, вам может потребоваться получить предпочтительную ширину, максимальную ширину или getSize (). GetWidth (). Не зная больше о макете, трудно сказать, как именно вам нужно это сделать, но вам нужно установить некоторую ширину на этикетке, чтобы ее можно было обернуть - нет никакого способа обойти это.

Единственный другой вариант, который я могу придумать, - это установить в качестве предпочтительной ширины на ярлыке нечто произвольное, которое, как вы знаете, должно всегда помещаться в доступном пространстве.

1 голос
/ 14 мая 2011

Используйте JTextArea. Текст может быть установлен для автоматического переноса. Вы можете поиграть со свойствами текстовой области, чтобы она выглядела как метка.

Вы можете использовать собственный маркер, чтобы «подчеркнуть» текст. Затем вы просто добавляете / удаляете маркер по мере необходимости. Rectangle Painter поможет вам начать работу.

...