`
wuce7758
  • 浏览: 182228 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论
  • YTT1121: 有网络拓扑发现的源代码么?能不能发我一份学习一下,现在我正要做 ...
    java拓扑图
  • YTT1121: 大神,有网络拓扑发现的源代码么?或者您会编写么?我需要做科研改 ...
    java拓扑图
  • YTT1121: 大神,有网络拓扑发现的源代码么?或者您会编写么?我需要做科研改 ...
    java拓扑图
  • poettang: 求代码分享学习,谢谢!膜拜大神!258026921@qq.co ...
    java拓扑图
  • oiqio: 87836238@qq.com,感谢楼主,来一份~
    java拓扑图

在自定义 JToolTip 里面显示组件

阅读更多

在自定义 JToolTip 里面显示组件

JToolTip

我们经常可以看到很多 Windows 程序显示出各种各样好看的工具栏提示, 不是默认的那种只有文字的提示... 但是 Java Swing 默认的那个, 似乎只有那个一行文字, well, how can we change it? 请参阅: JFC -- Chapter 24 - Building a Custom Component http://mail.phys-iasi.ro/Library/Computing/jfc_unleashed/ch24.htm

笔者基于文中的介绍写出了自己的解决方案. First, 写一个自定义的 ToolTipUI 来显示 JToolTip, 实现下列逻辑:
1. 如果没有在 JToolTip 中包含子组件(还记得嘛, 所有 JComponent 都是容器), 那么按照普通的模式显示 JToolTip, 稍微改进了一点, 就是可以显示多行的文字, 例如 "a\nb" 这样的文字就被显示为两行, 而不是默认的 JToolTip 显示的单行文本.
2. 如果包含了子组件, 就忽略设置的提示文本, 转而显示里面包含的组件, 这样就实现了在 JToolTip 中显示组件的功能. 源代码如下:

import java.awt.*;
import java.util.StringTokenizer;
import javax.swing.*;
import javax.swing.plaf.ComponentUI;
import javax.swing.plaf.basic.BasicToolTipUI;
/**
 * The ComponentToolTipUI class may be registered with the UIManager
 * to replace the ToolTipUI for JToolTip instances. When used, it
 * divides the ToolTip into multiple lines, if has child components,
 * all child components will be displayed instead of only some tooltip
 * text. Each line is divided by
 * the '\ n' character.
 * <p>
 * @author Mike Foley
 **/
public class ComponentToolTipUI extends BasicToolTipUI
{
    /**
     * The single shared UI instance.
     **/
    static ComponentToolTipUI sharedInstance = new ComponentToolTipUI();
    /**
     * The margin around the text.
     **/
    static final int MARGIN = 2;
    /**
     * The character to use in the StringTokenizer to
     * separate lines in the ToolTip. This could be the
     * system property end of line character.
     **/
    static final String lineSeparator = "\n";
    /**
     * MultiLineToolTipUI, constructor.
     * <p>
     * Have the constructor be protected so we can be subclassed,
     * but not created by client classes.
     **/
    protected ComponentToolTipUI()
    {
        super();
    }
    /**
     * Create the UI component for the given component.
     * The same UI can be shared for all components, so
     * return our shared instance.
     * <p>
     * @param c The component to create the UI for.
     * @return Our shared UI component instance.
     **/
    public static ComponentUI createUI(JComponent c)
    {
        return sharedInstance;
    }
    /**
     * Paint the ToolTip. Use the current font and colors
     * set for the given component.
     * <p>
     * @param g The graphics to paint with.
     * @param c The component to paint.
     **/
    public void paint(Graphics g, JComponent c)
    {
  // Paints each of the components in this container.
  if(c.getComponentCount() > 0) {
          c.paintComponents(g);
          return;
  }
  // If no components, then paint a muiltiple line tooltip


  //
        // Determine the size for each row.
        //
        Font font = c.getFont();
        FontMetrics fontMetrics = c.getFontMetrics(font);
        int fontHeight = fontMetrics.getHeight();
        int fontAscent = fontMetrics.getAscent();
        //
        // Paint the background in the tip color.
        //
        g.setColor(c.getBackground());
        Dimension size = c.getSize();
        g.fillRect(0, 0, size.width, size.height);
        //
        // Paint each line in the tip using the
        // foreground color. Use a StringTokenizer
        // to parse the ToolTip. Each line is left
        // justified, and the y coordinate is updated
        // through the loop.
        //
        g.setColor(c.getForeground());
        int y = 2+fontAscent;
        String tipText = ((JToolTip)c).getTipText();
        StringTokenizer tokenizer = new StringTokenizer(tipText, lineSeparator);
        int numberOfLines = tokenizer.countTokens();
        for (int i = 0; i < numberOfLines; i++)
        {
            g.drawString(tokenizer.nextToken(), MARGIN, y);
            y += fontHeight;
        }
    }

    // paint
    /**
     * The preferred size for the ToolTip is the width of
     * the longest row in the tip, and the height of a
     * single row times the number of rows in the tip.
     *
     * @param c The component whose size is needed.
     * @return The preferred size for the component.
     **/
    public Dimension getPreferredSize(JComponent c)
    {
        // If has children components
  if(c.getComponentCount() > 0) {
         return c.getLayout().preferredLayoutSize(c);
  }

  //
        // Determine the size for each row.
        //
        Font font = c.getFont();
        FontMetrics fontMetrics = c.getFontMetrics(font);
        int fontHeight = fontMetrics.getHeight();
        //
        // Get the tip text string.
        //
        String tipText = ((JToolTip)c).getTipText();
        //
        // Empty tip, use a default size.
        //
        if (tipText == null)
            return new Dimension(2 * MARGIN, 2 * MARGIN);
        //
        // Create a StringTokenizer to parse the ToolTip.
        //
        StringTokenizer tokenizer = new StringTokenizer(tipText, lineSeparator);
        int numberOfLines = tokenizer.countTokens();
        //
        // Height is number of lines times height of a single line.
        //
        int height = numberOfLines * fontHeight;
        //
        // Width is width of longest single line.
        //
        int width = 0;
        for (int i = 0; i < numberOfLines; i++)
        {
            int thisWidth = fontMetrics.stringWidth(tokenizer.nextToken());
            width = Math.max(width, thisWidth);
        }
        //
        // Add the margin to the size, and return.
        //
        return (new Dimension(width + 2 * MARGIN, height + 2 * MARGIN));

    }
    // getPreferredSize
}

// ComponentToolTipUI

接着, 我们定义一个包含了其它组件的 JToolTip:

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

public class MyTooltip extends javax.swing.JToolTip
{
  JButton jButton1 = new JButton();
  FlowLayout flowLayout1 = new FlowLayout();
  JTextField jTextField1 = new JTextField();

 public MyTooltip()
    {
    try  {
      jbInit();
    }
    catch(Exception e) {
      e.printStackTrace();
    }
 }

 public void setTipText(String tipText) {
    super.setTipText(tipText);
//    button.setText(tipText);
 }

 

  private void jbInit() throws Exception {
//    jLabel1.setMaximumSize(new Dimension(400, 300));
//    jLabel1.setMinimumSize(new Dimension(400, 300));
//    jLabel1.setPreferredSize(new Dimension(400, 300));
    jButton1.setText("This is a button included in the tool tip.");
    this.setLayout(flowLayout1);
    this.setOpaque(true);
    jTextField1.setText("jTextField1");
    this.add(jButton1, null);
    this.add(jTextField1, null);
  }


}

最后, 我们编写一个测试类来测试这个 JToolTip:

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

public class MyButton extends javax.swing.JButton
{

 public MyButton()
    {
 }

 public JToolTip createToolTip() {
  JToolTip tip = new MyTooltip();
  tip.setComponent(this);
  tip.setTipText(getToolTipText());
  return tip;
 }

 public static void main(String[] args)
    {
  try {
      UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
  } catch (Exception ex) {
    ex.printStackTrace();
  }

        try
        {
            String multiLineToolTipUIClassName =
            "ComponentToolTipUI";

//            System.out.println(multiLineToolTipUIClassName);

            UIManager.put( "ToolTipUI", multiLineToolTipUIClassName );
            UIManager.put( multiLineToolTipUIClassName,
            Class.forName( multiLineToolTipUIClassName ) );
        }
        catch( ClassNotFoundException cnfe )
        {
            System.err.println( "MultiLine ToolTip UI class not found" );
            System.err.println( cnfe );
        }

  final JFrame frame = new JFrame("Test JToolTip");
  frame.addWindowListener(new java.awt.event.WindowAdapter() {
         public void windowClosing(WindowEvent e) {
    frame.dispose();
    System.exit(0);
   }
  });

  MyButton button = new MyButton();
  button.setText("这个按钮显示一个包含组件的工具提示");
  button.setToolTipText("提示");

  frame.getContentPane().add(button);

  JButton buttonPlain = new JButton("这是一个包含多行文本提示的普通按钮");
  buttonPlain.setToolTipText("Line 1\nLine 2\n");

  frame.getContentPane().add(java.awt.BorderLayout.SOUTH, buttonPlain);

//  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  frame.pack();
  frame.show();
 }


}

编译并运行最后一个类: MyButton, 就可以看到包含了可以交互的按钮和文本框, 以及一个显示两行文本的工具栏提示。

分享到:
评论

相关推荐

    java swing-JToolTip的使用

    JToolTip 是 Java Swing 库提供的一个工具提示组件,用于在鼠标悬停或其他交互事件发生时显示文本提示信息。

    可视化组件:Swing JComponent总览

    #### (一)基本交互组件:获取用户的输入或者显示状态的简单组件 1. **按钮(JButton)**:这是一种常用的UI元素,允许用户通过点击来触发事件。它可以包含文本、图标或是两者结合,并支持快捷键的设置。开发人员...

    Java精通Swing程序设计

    - JToolTip:提供组件上的提示信息。 8. Swing的外观和感觉(LookAndFeel): Swing允许开发者改变应用程序的视觉风格,可以设置系统默认的LookAndFeel,也可以自定义LookAndFeel。 9. Swing应用实例: 通过...

    Java第9章GUI图形界面设计.ppt

    6. 其他组件:如JOptionPane用于显示对话框,JProgressBar显示进度,JToolTip显示提示信息,JSlider控制滑块,JTable和JTree显示表格和树状数据。 Java GUI设计允许开发者构建复杂的交互式界面,结合事件处理,可以...

    第十二个范例——Dialog、TooltipDialog、ProgressBar、TitlePane、Tooltip

    在Swing中,我们可以使用`JToolTip`类来实现,它会在鼠标停留在一个组件上一段时间后显示文本信息。JavaFX中,`Tooltip`类提供了类似的功能,允许设置延迟时间、显示时间和自定义样式。 `ProgressBar`是进度条,...

    JavaSwing界面设计(所有控件及示例)

    - `JToolTip` 显示鼠标悬停时的提示信息。 - `JProgressBar` 显示任务进度。 - `JSlider` 和 `JSpinner` 提供数值选择或调整。 - `JFileChooser` 和 `JColorChooser` 分别用于打开文件对话框和颜色选择对话框。 ...

    Swing界面库的例子

    它通常与其他组件关联,例如按钮或文本框,当鼠标悬停在这些组件上时,会显示额外的帮助信息。创建和设置`JToolTip`非常简单,可以使用`JComponent.setToolTipText(String text)`方法为组件添加提示文本。 2. JList...

    JAVA生成饼图

    我们可以创建一个自定义组件,如`JPanel`,并在其中实现绘图逻辑。 3. **JIamge.java**:这个文件可能包含了自定义的图像处理类,比如将生成的饼图保存为图像文件。在Java中,我们可以使用`java.awt.image....

    swing图形用户界面程序设计.ppt

    此外,Swing还提供了一些不可编辑的显示组件,如JLabel、JProgressBar和JToolTip,以及可编辑的组件,如JColorChooser、JFileChooser、JTable和JTextArea。 Swing的一个显著特性是其可插拔的外观和感觉(Pluggable ...

    JavaSwing界面设计(所有控件及示例).ppt

    - 显示组件:JLabel(标签)、JList(列表)、JComboBox(组合框)等,用于展示信息。 - 文本组件:JTextField(单行文本输入框)、JPasswordField(密码输入框)、JTextArea(多行文本区域)等,用于用户输入。 ...

    JavaSwingLayout

    5. **Uneditable Information Displays**:不可编辑的信息显示,如标签 (`JLabel`)、进度条 (`JProgressBar`) 和工具提示 (`JToolTip`)。 6. **Editable Displays of Formatted Information**:可编辑的信息显示,如...

    Java Swing Examples

    在本文档中,我们将详细介绍 Swing 中的一些关键组件,包括 JTable、JTree、JList、JToolTip、JComboBox、JMenu、JTabbedPane、Border、JSlider 等,并通过具体的示例来展示它们的应用场景。 #### 二、JTable 示例...

    Eclipse JAVA 计算器源码 适合初学者

    这些导入语句引入了GUI组件所需的类库,如`Frame`用于创建主窗口,`TextField`用于输入和显示数据,`Button`用于创建按钮等。 3. **类定义**: ```java public class computer extends Frame { // 类体... } ...

    Java Swing实例源码包.rar

    Java Swing实例源码包,包括了JComboBox 、Border、JList、JMenu、JSlider、JTabbedPane、JTable、JToolTip、JTree等常用Swing组件的用法示例,对Java编写界面来说,Swing确实是个不错的选择,希望这些示例能让你更...

    jQuery带箭头提示框tooltips插件集锦

    在网页开发中,提示框(Tooltips)是一种常见的交互元素,用于显示额外的信息,通常在用户鼠标悬停在某个元素上时出现。jQuery库提供了许多插件,使得创建具有箭头指示方向的提示框变得简单且高效。以下是一些优秀的...

    SWING样例

    SUN官方出的有关swing设计的样例,其中包括JTable的34个例子、JList的15个例子、JToolTip的4个例子、JComboBox的5个例子、JComboBox的6个例子、Border的3个例子、JSlider的4个例子。 都含源码,需要自己编译。

Global site tag (gtag.js) - Google Analytics