带有标题提示文本的JPanel边框

6

我在JPanel中使用setBorder(BorderFactory.createTitledBorder(title))来将其内容分组为一个带有标题的矩形。如何为该标题设置提示文本?


为了更快地获得帮助,请发布一个SSCCE,它是一个简短的、可运行的、可编译的示例。 - mKorbel
4个回答

6

一种可能的方法是嵌套组件,因为边框不是组件,所以无法具有工具提示,但可以使用一个专门用于容纳边框和工具提示的组件:

JPanel outer = new JPanel();
outer.setBorder(BorderFactory.createTitledBorder("Title"));
outer.setToolTipText("sample text");
JPanel inner = new JPanel();
outer.add(inner);

然后使用 inner 作为您想要分组的组件的容器。


你能告诉我 tooltiptext 的用途吗?我们只能从第二行代码中添加标题,这里的 tooltip 有什么用处? - Sukupa91
1
@Sushantp606 请问问题的提出者。请求是在边框上添加工具提示。(更严格地说,就像camickrs的答案所做的那样,在标题上添加)。 - kiheru

5

您可以重写面板的getToolTipText()方法,以检查鼠标是否悬停在标题文本上:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;

public class TitledBorderTest
{
    private static void createAndShowUI()
    {
        UIManager.getDefaults().put("TitledBorder.titleColor", Color.RED);
        Border lowerEtched = BorderFactory.createEtchedBorder(EtchedBorder.LOWERED);
        TitledBorder title = BorderFactory.createTitledBorder(lowerEtched, "Title");
//      title.setTitleJustification(TitledBorder.RIGHT);
        Font titleFont = UIManager.getFont("TitledBorder.font");
        title.setTitleFont( titleFont.deriveFont(Font.ITALIC + Font.BOLD) );

        JPanel panel = new JPanel()
        {
            @Override
            public String getToolTipText(MouseEvent e)
            {
                Border border = getBorder();

                if (border instanceof TitledBorder)
                {
                    TitledBorder tb = (TitledBorder)border;
                    FontMetrics fm = getFontMetrics( tb.getTitleFont() );
                    int titleWidth = fm.stringWidth(tb.getTitle()) + 20;
                    Rectangle bounds = new Rectangle(0, 0, titleWidth, fm.getHeight());
                    return bounds.contains(e.getPoint()) ? super.getToolTipText() : null;
                }

                return super.getToolTipText(e);
            }
        };
        panel.setBorder( title );
        panel.setToolTipText("Title With ToolTip");

        JFrame frame = new JFrame("SSCCE");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add( panel );
        frame.setSize(200, 200);
        frame.setLocationByPlatform( true );
        frame.setVisible( true );
    }

    public static void main(String[] args)
    {
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                createAndShowUI();
            }
        });
    }
}

这段代码假定标题在左边。如果您希望标题在右边,那么您需要调整文本范围的X值。


谢谢。这个想法对我有用。我认为它会强制设置标题的字体,但无妨。我可以改为使用边框的整个顶部条作为显示工具提示的边界。 - Hamid Fadishei
@HamidFadishei,只需使用getFont()即可获取面板字体,这是标题边框的默认字体。 - camickr
我认为两种想法都不错,但是现在听到Hamid Fadishei说他要使用完整的边框作为文本,我倾向于认为我更喜欢这个想法。这样,用户不必仅悬停在文本本身上,整个边框将告诉用户该JComponent内部有什么。 - searchengine27

1
我认为你无法在TitledBorder中添加setToolTipText。你可以为JComponent提供工具提示,但TitledBorder不是从JComponent派生的。
你可以尝试使用JPanel代替:
 ToolTipManager.sharedInstance().registerComponent(new JPanel());
 //ToolTipManager.sharedInstance().setDismissDelay(800000);

你能提供任何其他方法来将UI组件分组在带有工具提示文本的边框中吗? - Hamid Fadishei
我不知道如何使用您的建议来达到我在问题中所述的目标。也许它很简洁,而我又太菜了,在Swing方面无法理解重点! - Hamid Fadishei
我的意思是给边框添加工具提示,因为你无法给边框添加,边框不是JComponent。创建一个JPanel放置到另一个JPanel中,并在内部的JPanel上添加工具提示。但用户会发现提示信息像边框一样向上弹出。 - Maxim Shoustin

1
  • TollTip不是适合实验的组件,所有弹出窗口或工具提示的好解决方法都基于JWindow/非装饰JDialog

  • 也许不是必要的,在UIManager中键是可访问的,但在这种情况下,所有TollTips都具有相同的设置

enter image description here

import java.awt.*;
import javax.swing.*;
import javax.swing.border.Border;
import javax.swing.plaf.*;

public class ColoredToolTipExample extends JFrame {

    private static final long serialVersionUID = 1L;

    public ColoredToolTipExample() {
        Border line, raisedbevel, loweredbevel, title, empty;
        line = BorderFactory.createLineBorder(Color.black);
        raisedbevel = BorderFactory.createRaisedBevelBorder();
        loweredbevel = BorderFactory.createLoweredBevelBorder();
        title = BorderFactory.createTitledBorder("");
        empty = BorderFactory.createEmptyBorder(1, 1, 1, 1);
        Border compound;
        compound = BorderFactory.createCompoundBorder(empty, line);
        UIManager.put("ToolTip.foreground", new ColorUIResource(Color.red));
        UIManager.put("ToolTip.background", new ColorUIResource(Color.yellow));
        UIManager.put("ToolTip.font", new FontUIResource(new Font("Verdana", Font.PLAIN, 18)));
        UIManager.put("ToolTip.border", new BorderUIResource(compound));
        JButton button = new JButton("Hello, world");
        button.setToolTipText("<html> - myText <br> - myText <br> - myText <br>");
        getContentPane().add(button);
        JFrame frame = new JFrame("Colored ToolTip Example");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(300, 100);
        frame.setVisible(true);
    }

    public static void main(String args[]) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                new ColoredToolTipExample();
            }
        });
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接