जावा में मल्टी-लाइन टूलटिप्स?


105

मैं जावा में टूलटिप्स प्रदर्शित करने की कोशिश कर रहा हूं जो पैराग्राफ-लंबाई हो सकती है या नहीं। मैं लंबे टूलटिप्स शब्द-रैप कैसे कर सकता हूं?


कृपया एक कोड उदाहरण प्रदान करें।
स्टीफन थ्यबर्ग

1
यदि वे HTML टैग्स में लिपटे हुए हैं तो टूल टिप्स स्वचालित रूप से वर्ड-रैप नहीं करते हैं? मुझे यकीन नहीं है, इसलिए मैं इसे एक जवाब के रूप में नहीं डाल रहा हूं।
पॉल टॉम्बलिन

पॉल: केवल अगर आपके पास स्पष्ट रेखा-विराम है।
अमांडा एस

जवाबों:


146

यदि आप टूलटिप को टैग <html>और </html>टैग में लपेटते हैं , तो आप <br>टैग के साथ लाइनें तोड़ सकते हैं । उदाहरण और चर्चा के लिए http://www.jguru.com/faq/view.jsp?EID=10653 देखें ।

या आप JMultiLineToolTip क्लास का उपयोग कर सकते हैं जो नेट पर कई जगहों पर देखी जा सकती हैं, जिनमें https://github.com/ls-cwi/yoshiko-app/blob/master/src/main/mava/com/yoshiko/internal/ शामिल हैं। देखें / JMultiLineToolTip.java


1
मैंने आपके द्वारा सुझाए गए JMultiLineToolTip क्लास का उपयोग किया। एक बार मैंने उचित आकार में टूलटिप को सीमित करने के लिए setFixedWidth () का उपयोग किया, तो इसने बहुत अच्छा काम किया। धन्यवाद!
अमांडा एस

24

टूलटिप पाठ जो " <html>" से शुरू होता है, उसे HTML के रूप में माना जाएगा। बेशक यह बहुत व्यापक HTML हो सकता है।

आप अपने स्वयं के घटक के साथ टूलटिप को बदलने के लिए JComponent.createTooltip को ओवरराइड कर सकते हैं जो आपको पसंद है वह प्रदर्शित कर सकता है।


20

मुझे पता है कि यह एक बहुत पुराना है, लेकिन मुझे HTML कोड का उपयोग करके एक बहुत ही सरल समाधान मिला है!

बस एक निश्चित चौड़ाई के साथ एक HTML पैरा का उपयोग करें:

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

क्या होगा यदि मैं टेक्स्ट को प्रदर्शित करना चाहता हूं जो टूलटिप के आकार से बहुत कम है? "अधिकतम-चौड़ाई" टैग यहां काम नहीं करता है
nicolay.laptev

5

HTML टूलटिप्स का उपयोग करें और मैन्युअल रूप से अपनी लाइनों को तोड़ें (एक निश्चित लाइन की लंबाई वाला एक सरल शब्द टोकन इसे करना चाहिए)। बस सुनिश्चित करें कि आपका टूलटॉप पाठ "<HTML>" से शुरू होता है। "<BR/>" या "<P>" के साथ लाइनें तोड़ें। मुझे लगता है कि यह सबसे साफ समाधान नहीं है और जावा का एचटीएमएल समर्थन भयानक है, लेकिन इसे काम करना चाहिए।


4

उदाहरण:

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

यह पूछने वाले के सवाल का जवाब नहीं देता है। वह लपेटने के बारे में पूछ रहा था जब इसे प्रदर्शित किया जाता है, स्रोत कोड में नहीं।
स्लेज

2
@ArtB यह उदाहरण कोड दो-लाइन टूलटिप देता है जैसा कि पूछा गया है।
इलेमा

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

आप JToolTip को उप-वर्ग कर सकते हैं, जो एक घटक है, और घटक पर createToolTip () को ओवरराइड करता है।


1

यहाँ एक संस्करण है जो मैंने पहले इस्तेमाल किया है, यह अच्छी तरह से काम करता है यदि आप अपने टूल टिप्स को संसाधन बंडलों से लोड कर रहे हैं:

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>टैग्स के साथ एक विशिष्ट लंबाई में स्ट्रिंग करता है । यह पॉल टेलर द्वारा पोस्ट की गई मल्टीलाइनटाइप्स क्लास पर आधारित है, लेकिन इसमें एक बग है जो स्ट्रिंग के कुछ हिस्सों को छोड़ देता है और वास्तव में स्ट्रिंग को एक विशिष्ट लंबाई तक सीमित नहीं करता है।

मेरी कक्षा का उपयोग करने के लिए, बस स्प्लिटटूलिप विधि को लिखकर MultiLineToolTips.splitToolTip(yourString);या MultiLineToolTips.splitToolTip(yourString, maxLength);यदि आप इसे विशिष्ट अधिकतम लंबाई में विभाजित करना चाहते हैं, तो इनवॉइस करें । यह अच्छी तरह से स्वरूपित टूल टिप स्ट्रिंग्स बनाएगा।

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 न हो । <html><pre>अपने पाठ का उपयोग करें या उससे बचें। मुझे भी <font size=3>कुछ सभ्य दिखने के लिए इसका उपयोग करना पड़ा ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.