Java'da çok satırlı araç ipuçları?


105

Java'da paragraf uzunluğu olan veya olmayan araç ipuçlarını görüntülemeye çalışıyorum. Uzun araç ipuçlarını nasıl sözcük kaydırabilirim?


Lütfen bir kod örneği sağlayın.
Stefan Thyberg

1
Araç ipuçları, HTML etiketlerine sarılmışsa otomatik olarak sözcük kaydırmaz mı? Emin değilim, bu yüzden bunu cevap olarak koymuyorum.
Paul Tomblin

Paul: Yalnızca açık satır sonlarınız varsa.
Amanda S

Yanıtlar:


146

Araç ipucunu <html>ve </html>etiketlerini sararsanız, satırları <br>etiketlerle ayırabilirsiniz . Örnekler ve tartışma için http://www.jguru.com/faq/view.jsp?EID=10653 adresine bakın .

Veya https://github.com/ls-cwi/yoshiko-app/blob/master/src/main/java/com/yoshiko/internal/ dahil olmak üzere internette birçok yerde bulunabilen JMultiLineToolTip sınıfını kullanabilirsiniz. view / JMultiLineToolTip.java


1
Önerdiğiniz JMultiLineToolTip sınıfını kullandım. Araç ipucunu makul bir boyutla sınırlamak için setFixedWidth () kullandıktan sonra harika çalıştı. Teşekkürler!
Amanda S

24

" <html>" İle başlayan araç ipucu metni HTML olarak değerlendirilecektir. Tabii ki bu çok geniş HTML olabilir.

Sen geçersiz kılabilirsiniz JComponent.createTooltip sizin gibi whatevee görüntüleyebilir kendi bileşeni ile araç ipucu değiştirin.


20

Bunun oldukça eski olduğunu biliyorum ama HTML kodunu kullanarak oldukça basit bir çözüm buldum!

Sabit genişliğe sahip bir HTML Paragrafı kullanın:

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

Araç ipucu boyutundan çok daha kısa bir metni görüntülemek istersem ne olur? "max-width" etiketi burada çalışmıyor
nickolay.laptev

5

HTML araç ipuçlarını kullanın ve satırlarınızı manuel olarak ayırın (sabit bir satır uzunluğuna sahip basit bir kelime belirteci bunu yapmalıdır). Araç üstü metninizin "<HTML>" ile başladığından emin olun. Satırları "<BR/>" veya "<P>" ile ayırın. Bunun en temiz çözüm olmadığının ve Java'nın HTML desteğinin korkunç olduğunun farkındayım, ancak işleri halletmesi gerekiyor.


4

Misal:

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

Bu soruyu soranın sorusuna cevap vermez. Kaynak kodda değil görüntülendiğinde sarmayı soruyordu.
Kızak

2
@ArtB bu örnek kod, istendiği gibi iki satırlık bir araç ipucu verir.
Thelema

4

Bu biraz iyileştirilebilirdi, ancak benim yaklaşımım, araç ipucu metnini sağlanan uzunlukta bölen, ancak mümkün olduğunda boşluktaki kelimeleri kırmak için ayarlanan araç ipucunu ayarlamadan önce çağrılan yardımcı bir işlevdi.

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

Gibi kullanın

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

2

Bir Bileşen olan JToolTip'i alt sınıflandırabilir ve bileşende createToolTip () öğesini geçersiz kılabilirsiniz.


1

İşte daha önce kullandığım bir sürüm, araç ipuçlarınızı ResourceBundles'dan yüklüyorsanız iyi çalışıyor:

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

}

Ve kullanıcı arayüzünüz oluşturulmadan önce bu yöntemi çağırarak kullanırsınız:

MultiLineToolTipUI.installUI();

Ardından, özellikler dosyalarınızda araç ipuçlarınızı istediğiniz gibi kaydırmak için yeni satırlar ekleyin.


1

Dizeleri <br>etiketlerle belirli bir uzunlukta otomatik olarak biçimlendiren bir yardımcı program sınıfı oluşturdum . Paul Taylor tarafından yayınlanan MultiLineToolTips sınıfına dayalıdır, ancak onun içinde dizenin bölümlerini atlayan ve aslında dizeyi belirli bir uzunlukla sınırlamayan bir hata vardır.

Sınıfımı kullanmak için, sadece yazarak MultiLineToolTips.splitToolTip(yourString);veya MultiLineToolTips.splitToolTip(yourString, maxLength);belirli bir maksimum uzunluğa bölmek istiyorsanız splitToolTip yöntemini çağırın . Bu, güzel biçimlendirilmiş araç ipucu dizeleri oluşturacaktır.

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>Araç ipucu metninize yeni eklerseniz , metninize /*...*/veya HTML'ye sahip olana kadar çalışıyor gibi görünecektir . <html><pre>Metninizi kullanın veya metninizden kaçının. Ayrıca <font size=3>biraz düzgün görünmesi için kullanmak zorunda kaldım.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.