Java의 여러 줄 도구 설명?


105

단락 길이 일 수도 있고 아닐 수도있는 Java에서 도구 설명을 표시하려고합니다. 긴 툴팁을 줄 바꿈하려면 어떻게해야합니까?


코드 예제를 제공하십시오.
Stefan Thyberg

1
도구 설명이 HTML 태그로 래핑 된 경우 자동으로 자동 줄 바꿈되지 않습니까? 확실하지 않아서 답변으로 넣지 않았습니다.
Paul Tomblin

Paul : 명시적인 줄 바꿈이있는 경우에만.
Amanda S

답변:


146

툴팁을 <html></html>태그로 감싸면 태그로 줄을 끊을 수 있습니다 <br>. 예제 및 토론 은 http://www.jguru.com/faq/view.jsp?EID=10653 을 참조 하십시오 .

또는 https://github.com/ls-cwi/yoshiko-app/blob/master/src/main/java/com/yoshiko/internal/을 포함하여 인터넷의 여러 위치에서 찾을 수있는 JMultiLineToolTip 클래스를 사용할 수 있습니다. view / JMultiLineToolTip.java


1
제안하신 JMultiLineToolTip 클래스를 사용했습니다. setFixedWidth ()를 사용하여 툴팁을 합리적인 크기로 제한하면 훌륭하게 작동했습니다. 감사!
Amanda S

24

" <html>"로 시작하는 도구 설명 텍스트 는 HTML로 처리됩니다. 물론 그것은 매우 광범위한 HTML 일 수 있습니다.

JComponent.createTooltip 을 재정 의하여 도구 설명을 원하는 것을 표시 할 수있는 자체 구성 요소로 바꿀 수 있습니다 .


20

나는 이것이 꽤 오래되었다는 것을 알고 있지만 HTML 코드를 사용하여 아주 간단한 해결책을 찾았습니다!

고정 너비의 HTML 단락을 사용하십시오.

setToolTipText("<html><p width=\"500\">" +value+"</p></html>");

툴팁 크기보다 훨씬 짧은 텍스트를 표시하려면 어떻게해야합니까? "최대 폭"태그는 여기에 작동하지 않습니다
nickolay.laptev

5

HTML 툴팁을 사용하고 수동으로 줄을 끊습니다 (고정 된 줄 길이를 가진 간단한 단어 토크 나이저가해야합니다). 도구 탑 텍스트가 "<HTML>"로 시작하는지 확인하십시오. "<BR/>"또는 "<P>"로 줄을 끊습니다. 나는 그것이 가장 깨끗한 솔루션이 아니며 Java의 HTML 지원이 끔찍하다는 것을 알고 있지만 일을 끝내야합니다.


4

예:

jTextField1.setToolTipText("<html>"
                              + "Line One"
                              +"<br>"
                              + "Line 2"
                         + "</html>");

이것은 질문자의 질문에 대답하지 않습니다. 그는 소스 코드가 아니라 표시 될 때 래핑에 대해 질문했습니다.
썰매

2
@ArtB이 예제 코드는 요청한대로 두 줄의 툴팁을 제공합니다.
Thelema

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));

2

Component 인 JToolTip을 서브 클래스 화하고 컴포넌트에서 createToolTip ()을 재정의 할 수 있습니다.


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();

그런 다음 속성 파일에서 원하는대로 도구 설명을 래핑하기 위해 개행 문자를 삽입합니다.


1

<br>태그 를 사용하여 문자열을 특정 길이로 자동 포맷하는 유틸리티 클래스를 만들었습니다 . Paul Taylor가 게시 한 MultiLineToolTips 클래스를 기반으로하지만, 그의 버그는 문자열의 일부를 건너 뛰고 실제로 문자열을 특정 길이로 제한하지 않습니다.

내 클래스를 사용하려면 작성 MultiLineToolTips.splitToolTip(yourString);하거나 MultiLineToolTips.splitToolTip(yourString, maxLength);특정 최대 길이로 분할 하려면 splitToolTip 메서드를 호출하면 됩니다. 이것은 멋지게 형식화 된 도구 설명 문자열을 생성합니다.

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

/** A helper class to split strings into a certain length,
 * formatted with html {@literal<br>} tags for multi-line tool tips.
 * Based on the MultiLineToolTips class posted by
 * <a href="https://stackoverflow.com/users/1480018/paul-taylor">Paul Taylor</a>
 * on <a href="https://stackoverflow.com/a/13503677/9567822">Stack Overflow</a>
 * @author <a href="https://stackoverflow.com/users/9567822/andrew-lemaitre?tab=profile">Andrew LeMaitre</a>
 */
public final class MultiLineToolTips {

    /** Private constructor for utility class. */
    private MultiLineToolTips() {
    }

    /** Default max length of the tool tip when split with {@link #splitToolTip(String)}. */
    private static final int DIALOG_TOOLTIP_MAX_SIZE = 75;

    /** A function that splits a string into sections of {@value #DIALOG_TOOLTIP_MAX_SIZE} characters or less.
     * If you want the lines to be shorter or longer call {@link #splitToolTip(String, int)}.
     * @param toolTip The tool tip string to be split
     * @return the tool tip string with HTML formatting to break it into sections of the correct length
     */
    public static String splitToolTip(final String toolTip) {
        return splitToolTip(toolTip, DIALOG_TOOLTIP_MAX_SIZE);
    }

    /**  An overloaded function that splits a tool tip string into sections of a specified length.
     * @param toolTip The tool tip string to be split
     * @param desiredLength The maximum length of the tool tip per line
     * @return The tool tip string with HTML formatting to break it into sections of the correct length
     */
    public static String splitToolTip(final String toolTip, final int desiredLength) {
        if (toolTip.length() <= desiredLength) {
            return toolTip;
        }

        List<String>  parts = new ArrayList<>();
        int stringPosition = 0;

        while (stringPosition < toolTip.length()) {
            if (stringPosition + desiredLength < toolTip.length()) {
                String tipSubstring = toolTip.substring(stringPosition, stringPosition + desiredLength);
                int lastSpace = tipSubstring.lastIndexOf(' ');
                if (lastSpace == -1 || lastSpace == 0) {
                    parts.add(toolTip.substring(stringPosition, stringPosition + desiredLength));
                    stringPosition += desiredLength;
                } else {
                    parts.add(toolTip.substring(stringPosition, stringPosition + lastSpace));
                    stringPosition += lastSpace;
                }
            } else {
                parts.add(toolTip.substring(stringPosition));
                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();
    }
}

0

<html>도구 설명 텍스트에 추가 하면 텍스트에 /*...*/또는 HTML 이있을 때까지 작동하는 것처럼 보입니다 . <html><pre>텍스트를 사용 하거나 이스케이프하십시오. 나는 또한 <font size=3>그것을 다소 괜찮아 보이 도록 사용해야 했습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.