Chú giải công cụ nhiều dòng trong Java?


105

Tôi đang cố gắng hiển thị chú giải công cụ trong Java có thể dài hoặc không dài đoạn. Làm cách nào để tôi có thể gói gọn các chú giải công cụ dài?


Vui lòng cung cấp một ví dụ về mã.
Stefan Thyberg

1
Các mẹo công cụ không tự động bọc từ nếu chúng được bao bọc trong các thẻ HTML? Tôi không chắc, vì vậy tôi không đưa điều này làm câu trả lời.
Paul Tomblin

Paul: Chỉ khi bạn có ngắt dòng rõ ràng.
Amanda S

Câu trả lời:


146

Nếu bạn bọc chú giải công cụ <html></html>thẻ, bạn có thể ngắt dòng bằng <br>thẻ. Xem http://www.jguru.com/faq/view.jsp?EID=10653 để biết ví dụ và thảo luận.

Hoặc bạn có thể sử dụng lớp JMultiLineToolTip có thể tìm thấy nhiều nơi trên mạng, bao gồm https://github.com/ls-cwi/yoshiko-app/blob/master/src/main/java/com/yoshiko/internal/ view / JMultiLineToolTip.java


1
Tôi đã sử dụng lớp JMultiLineToolTip mà bạn đã đề xuất. Khi tôi sử dụng setFixedWidth () để giới hạn chú giải công cụ ở kích thước hợp lý, nó hoạt động rất tốt. Cảm ơn!
Amanda S

24

Văn bản chú giải công cụ bắt đầu bằng " <html>" sẽ được coi là HTML. Tất nhiên đó có thể là HTML rất rộng.

Bạn có thể ghi đè JComponent.createTooltip để thay thế chú giải công cụ bằng thành phần của riêng bạn có thể hiển thị whatevee mà bạn thích.


20

Tôi biết cái này khá cũ nhưng tôi đã tìm thấy một giải pháp khá đơn giản bằng cách sử dụng mã HTML!

Chỉ cần sử dụng Đoạn văn HTML có chiều rộng cố định:

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

Điều gì xảy ra nếu tôi muốn hiển thị văn bản ngắn hơn nhiều so với kích thước chú giải công cụ? "max-width" tag không làm việc ở đây
nickolay.laptev

5

Sử dụng chú giải công cụ HTML và ngắt dòng của bạn theo cách thủ công (nên làm điều đó bằng công cụ tokenizer từ đơn giản với độ dài dòng cố định). Chỉ cần đảm bảo văn bản trên thanh công cụ của bạn bắt đầu bằng "<HTML>". Ngắt dòng bằng "<BR/>" hoặc "<P>". Tôi nhận ra rằng đó không phải là giải pháp sạch sẽ nhất và hỗ trợ HTML của Java rất kinh khủng, nhưng nó sẽ hoàn thành công việc.


4

Thí dụ:

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

Điều này không trả lời câu hỏi của người hỏi. Anh ấy đang hỏi về cách gói khi nó được hiển thị, không phải trong mã nguồn.
Xe trượt tuyết vào

2
@ArtB mã ví dụ này cung cấp một chú giải công cụ hai dòng như đã hỏi.
Thelema

4

Điều này có thể được cải thiện phần nào, nhưng cách tiếp cận của tôi là một chức năng trợ giúp được gọi trước khi thiết lập chú giải công cụ để chia văn bản chú giải công cụ ở độ dài đã cho, nhưng được điều chỉnh để ngắt các từ trên khoảng trống nếu có thể.

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

Sử dụng như

jComponent.setToolTipText(MultiLineTooltips.splitToolTip(TOOLTIP));

2

Bạn có thể phân lớp JToolTip, là một Thành phần và ghi đè createToolTip () trên thành phần.


1

Đây là phiên bản mà tôi đã sử dụng trước đây, nó hoạt động tốt nếu bạn đang tải các mẹo công cụ của mình từ 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);
    }

}

Và bạn sẽ sử dụng nó bằng cách gọi phương thức này, trước khi giao diện người dùng của bạn được tạo:

MultiLineToolTipUI.installUI();

Sau đó, trong các tệp thuộc tính của bạn, chỉ cần chèn các dòng mới để gói các mẹo công cụ của bạn như mong muốn.


1

Tôi đã tạo một lớp tiện ích tự động định dạng chuỗi theo độ dài cụ thể bằng <br>các thẻ. Nó dựa trên lớp MultiLineToolTips được đăng bởi Paul Taylor, nhưng của anh ấy có một lỗi trong đó bỏ qua các phần của chuỗi và không thực sự giới hạn chuỗi ở một độ dài cụ thể.

Để sử dụng lớp của tôi, chỉ cần gọi phương thức splitToolTip bằng cách viết MultiLineToolTips.splitToolTip(yourString);hoặc MultiLineToolTips.splitToolTip(yourString, maxLength);nếu bạn muốn chia nó thành độ dài tối đa cụ thể. Điều này sẽ tạo ra các chuỗi mẹo công cụ được định dạng độc đáo.

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

Nếu bạn chỉ thêm <html>vào văn bản chú giải công cụ của mình, nó sẽ hoạt động cho đến khi bạn có /*...*/hoặc HTML trong văn bản của mình. Sử dụng <html><pre>hoặc thoát khỏi văn bản của bạn. Tôi cũng đã phải sử dụng <font size=3>để làm cho nó trông khá ổn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.