【Swing入门教程】一步一步做Netbeans(3):定制可显示多行的JToolTip

    技术2022-05-20  45

          Netbeans上大部分组件的标签提示都是单行的,想给按钮等设置标签提示直接用setToolTipText(String tip)即可。但如果要设置多行的标签提示怎么办,Netbeans上就有多行的标签提示,如下图示:

          网上有人说用setToolTipText("<html>aaaa /br bbbbb </html>")可以,哈原来这么简单,试了下,纯粹扯淡。看了下JComponent源码,每个JComponent都默认带着一个JToolTip;当你看到JToolTip的javadoc时,Sun很明确的告诉你:需要创建自定义 ToolTip 显示的组件可以重写 JComponent 的 createToolTip 方法,并使用此类的一个子类。

         方法:先自定义一个继承自JToolTip的MultiLineToolTip,对要实现多行提示的组件重写createToolTip()方法,在用setToolTipText(String tip)即可(多行用'/n'做分割);先看效果:

    MultiLineToolTip的实现

           这里需要自制JToolTip的L&F,将要显示的多行文字放入字符串数组内,计算显示面板的宽度高度,遍历数组将内容画到面板上即可:

    package com.monitor1394.netbeans.component; import java.awt.Dimension; import java.awt.FontMetrics; import java.awt.Graphics; import java.awt.Toolkit; import java.io.BufferedReader; import java.io.IOException; import java.io.StringReader; import java.util.Enumeration; import java.util.Vector; import javax.swing.JComponent; import javax.swing.JToolTip; import javax.swing.SwingUtilities; import javax.swing.plaf.metal.MetalToolTipUI; /** * 可显示多行的ToolTip * * @author monitor * Created on 2011-2-26, 22:12:06 */ public class MultiLineToolTip extends JToolTip { public MultiLineToolTip() { setUI(new MultiLineToolTipUI()); } private class MultiLineToolTipUI extends MetalToolTipUI { private String[] strs; private int maxWidth = 0; @Override public void paint(Graphics g, JComponent c) { FontMetrics metrics = c.getFontMetrics(g.getFont()); Dimension size = c.getSize(); g.setColor(c.getBackground()); g.fillRect(0, 0, size.width, size.height); g.setColor(c.getForeground()); if (strs != null) { for (int i = 0; i < strs.length; i++) { g.drawString(strs[i], 3, (metrics.getHeight()) * (i + 1)); } } } @Override public Dimension getPreferredSize(JComponent c) { FontMetrics metrics = Toolkit.getDefaultToolkit().getFontMetrics(c.getFont()); String tipText = ((JToolTip) c).getTipText(); if (tipText == null) { tipText = " "; } BufferedReader br = new BufferedReader(new StringReader(tipText)); String line; int maxWidth = 0; Vector v = new Vector(); try { while ((line = br.readLine()) != null) { int width = SwingUtilities.computeStringWidth(metrics, line); maxWidth = (maxWidth < width) ? width : maxWidth; v.addElement(line); } } catch (IOException ex) { ex.printStackTrace(); } int lines = v.size(); if (lines < 1) { strs = null; lines = 1; } else { strs = new String[lines]; int i = 0; for (Enumeration e = v.elements(); e.hasMoreElements(); i++) { strs[i] = (String) e.nextElement(); } } int height = metrics.getHeight() * lines; this.maxWidth = maxWidth; return new Dimension(maxWidth + 6, height + 4); } } }

    TabButton类需要重写createToolTip()类:

    @Override public JToolTip createToolTip() { MultiLineToolTip tip=new MultiLineToolTip(); return tip; }

    将要显示的内容设置上:

    setToolTipText("按住 Shift 键并单击可关闭所有文档/n按住 Alt 键并单击可关闭其他文档");

    搞定收工。

     


    最新回复(0)