110

段落の長さである場合とそうでない場合があるJavaでツールチップを表示しようとしています。長いツールチップをワードラップするにはどうすればよいですか?

4

10 に答える 10

156

ツールチップを<html></html>タグで囲むと、タグで改行でき<br>ます。例と説明については、 https://web.archive.org/web/20060625031340/http://www.jguru.com/faq/view.jsp?EID=10653を参照してください。その議論からの主な要点:fButton.setToolTipText("<html><font face=\"sansserif\" color=\"green\">first line<br>second line</font></html>");

または、 https://github.com/ls-cwi/yoshiko-app/blob/master/src/main/java/com/yoshiko/internal/など、ネット上の多くの場所で見つけることができる JMultiLineToolTip クラスを使用できます 。ビュー/JMultiLineToolTip.java

于 2009-05-15T13:35:01.053 に答える
24

" " で始まるツールチップ テキスト<html>は HTML として扱われます。もちろん、それは非常に広い HTML かもしれません。

JComponent.createTooltipをオーバーライドして、ツールチップを、好きなものを表示できる独自のコンポーネントに置き換えることができます。

于 2009-05-15T13:38:25.867 に答える
23

これはかなり古いものですが、HTMLコードを使用した非常に簡単な解決策を見つけました!

固定幅の HTML 段落を使用するだけです。

setToolTipText("<html><p width=\"500\">" +value+"</p></html>");
于 2013-06-09T10:19:05.263 に答える
6

例:

jTextField1.setToolTipText("<html>"
                              + "Line One"
                              +"<br>"
                              + "Line 2"
                         + "</html>");
于 2012-11-20T14:14:42.103 に答える
5

HTML ツールチップを使用し、手動で行を分割します (行の長さが固定された単純な単語トークナイザーを使用する必要があります)。ツールチップのテキストが「<HTML>」で始まることを確認してください。"<BR/>" または "<P>" で改行します。これが最もクリーンなソリューションではなく、Java の HTML サポートがひどいことはわかっていますが、これで問題は解決するはずです。

于 2009-05-15T13:35:09.633 に答える
4

これは多少改善される可能性がありますが、私のアプローチは、提供された長さでツールヒントのテキストを分割するツールヒントを設定する前に呼び出されるヘルパー関数でしたが、可能な場合はスペースで単語を分割するように調整されました。

import java.util.ArrayList;
import java.util.List;

/**
 *
 */
public class MultiLineTooltips
{
    private static int DIALOG_TOOLTIP_MAX_SIZE = 75;
    private static final int SPACE_BUFFER = 10;

    public static String splitToolTip(String tip)
    {
        return splitToolTip(tip,DIALOG_TOOLTIP_MAX_SIZE);
    }
    public static String splitToolTip(String tip,int length)
    {
        if(tip.length()<=length + SPACE_BUFFER )
        {
            return tip;
        }

        List<String>  parts = new ArrayList<>();

        int maxLength = 0;
        String overLong = tip.substring(0, length + SPACE_BUFFER);
        int lastSpace = overLong.lastIndexOf(' ');
        if(lastSpace >= length)
        {
            parts.add(tip.substring(0,lastSpace));
            maxLength = lastSpace;
        }
        else
        {
            parts.add(tip.substring(0,length));
            maxLength = length;
        }

        while(maxLength < tip.length())
        {
            if(maxLength + length < tip.length())
            {
                parts.add(tip.substring(maxLength, maxLength + length));
                maxLength+=maxLength+length;
            }
            else
            {
                parts.add(tip.substring(maxLength));
                break;
            }
        }

        StringBuilder  sb = new StringBuilder("<html>");
        for(int i=0;i<parts.size() - 1;i++)
        {
            sb.append(parts.get(i)+"<br>");
        }
        sb.append(parts.get(parts.size() - 1));
        sb.append(("</html>"));
        return sb.toString();
    }
}

のように使う

jComponent.setToolTipText(MultiLineTooltips.splitToolTip(TOOLTIP));
于 2012-11-21T23:23:33.080 に答える
2

コンポーネントであるJToolTipをサブクラス化し、コンポーネントのcreateToolTip()をオーバーライドできます。

于 2009-05-15T14:43:26.193 に答える
1

これは私が以前に使用したバージョンです。ResourceBundles からツール ヒントを読み込んでいる場合にうまく機能します。

import javax.swing.JComponent;
import javax.swing.JToolTip;
import javax.swing.LookAndFeel;
import javax.swing.UIManager;
import javax.swing.plaf.ComponentUI;
import javax.swing.plaf.ToolTipUI;
import java.awt.Dimension;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.util.regex.Pattern;

/**
 * A tooltip that wraps multi-line text.
 */
public final class MultiLineToolTipUI extends ToolTipUI {

    private static final int INSET = 2;

    private static final Pattern LINE_SPLITTER = Pattern.compile("$", Pattern.MULTILINE);

    private static final MultiLineToolTipUI SHARED_INSTANCE = new MultiLineToolTipUI();

    /**
     * Install the multi-line tooltip into the UI manager.
     */
    public static void installUI() {
        String toolTipUI = MultiLineToolTipUI.class.getName();
        UIManager.put("ToolTipUI", toolTipUI);
        UIManager.put(toolTipUI, MultiLineToolTipUI.class);
    }

    @SuppressWarnings("UnusedDeclaration")
    public static ComponentUI createUI(JComponent c) {
        return SHARED_INSTANCE;
    }

    private MultiLineToolTipUI() {}

    @Override
    public Dimension getMaximumSize(JComponent c) {
        return getPreferredSize(c);
    }

    @Override
    public Dimension getMinimumSize(JComponent c) {
        return getPreferredSize(c);
    }

    @Override
    public Dimension getPreferredSize(JComponent c) {
        String[] lines = LINE_SPLITTER.split(((JToolTip) c).getTipText());
        if (lines.length == 0) {
            return new Dimension(2 * INSET, 2 * INSET);
        }
        FontMetrics metrics = c.getFontMetrics(c.getFont());
        Graphics g = c.getGraphics();
        int w = 0;
        for (String line : lines) {
            w = Math.max(w, (int) metrics.getStringBounds(line, g).getWidth());
        }
        int h = lines.length * metrics.getHeight();
        return new Dimension(w + 2 * INSET, h + 2 * INSET);
    }

    @Override
    public void installUI(JComponent c) {
        LookAndFeel.installColorsAndFont(c, "ToolTip.background", "ToolTip.foreground", "ToolTip.font");
        LookAndFeel.installBorder(c, "ToolTip.border");
    }

    @Override
    public void paint(Graphics g, JComponent c) {
        int w = c.getWidth(), h = c.getHeight();
        g.setColor(c.getBackground());
        g.fillRect(0, 0, w, h);
        g.setColor(c.getForeground());
        g.drawRect(0, 0, w, h);
        String[] lines = LINE_SPLITTER.split(((JToolTip) c).getTipText());
        if (lines.length != 0) {
            FontMetrics metrics = c.getFontMetrics(c.getFont());
            int height = metrics.getHeight();
            int y = INSET + metrics.getAscent();
            for (String line : lines) {
                g.drawString(line, INSET, y);
                y += height;
            }
        }
    }

    @Override
    public void uninstallUI(JComponent c) {
        LookAndFeel.uninstallBorder(c);
    }

}

UI を作成する前に、このメソッドを呼び出して使用します。

MultiLineToolTipUI.installUI();

次に、プロパティ ファイルに改行を挿入して、必要に応じてツール ヒントをラップします。

于 2013-04-06T00:33:14.227 に答える