`
starry198804265811
  • 浏览: 9913 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

如何自定义ToolTip

阅读更多

1 原理

  Swing默认的JToolTip只能显示文本,有时我们需要在ToolTip上显示格式化文本、图像甚至组件,应该怎样来实现呢?Swing中的ToolTip是用组件JToolTip来实现的,那么我们可以自定义一个类继承自JToolTip,然后重载它的paintComponent(Graphics)方法,在此方法中我们告诉Swing如何绘制ToolTip自己;因为所有的JComponent都是Container的子类,因此我们可以向自己的ToolTip中添加组件,就像在容器中添加组件一样,JComponent.paintChildren(Graphics)方法可以绘制容器中的子组件,我们甚至可以不考虑如何绘制ToolTip中的组件。
  JComponent.createToolTip()方法返回用于显示toolTip的JToolTip实例,组件通常不应该重载此方法,但它可用于显示不同于(默认实现)的toolTip。方法签名为:
  public JToolTip createToolTip();

  我们在需要显示自定义toolTip的类中重载此方法,返回一个自定义的ToolTip实例,就可以实现显示自定义的toolTip了。
  同时,组件的setToolTipText(String)方法依然是有效的,调用我们自定义组件的此方法可以设置提示文本,在createToolTip()方法返回的自定义的ToolTip实例中,调用JToolTip.getTipText()方法就可以获得这个文本。

2 实例代码
2.1 定义一个JToolTip的子类
package test.ui.wnd;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Paint;
import javax.swing.JButton;
import javax.swing.JToolTip;

public class MyToolTip extends JToolTip {

     private static final long serialVersionUID = 1L;
     private JButton jb;
    
     public MyToolTip() {
          super();
          jb = new JButton("Push me!");
          jb.setLocation(10, 30);
          jb.setSize(100,30);
          add(jb);
     }
    
     public Dimension getPreferredSize() {
          return new Dimension(200,100);
     }
    
     public void paintComponent(Graphics g) {
          Graphics2D g2d = (Graphics2D)g;
         
          int width = (int)(getPreferredSize().getWidth());
          int height = (int)(getPreferredSize().getHeight());
          Paint oldPaint = g2d.getPaint();
          g2d.setPaint(Color.CYAN);
          g2d.fillRect(0, 0, width, height);
          g2d.setPaint(oldPaint);
         
          if (getTipText() != null) {
               g2d.drawString(getTipText(), 10, 20);
          }
         
     }
    
     public void paintChildren(Graphics g) {
          jb.repaint();
     }
    
     public JButton getButton() {
          return jb;
     }

}
 
2.2 自定义一个组件
package test.ui.wnd;

import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JToolTip;

public class MyButton extends JButton {

     private static final long serialVersionUID = -4212536258012660909L;
    
     private MyToolTip toolTip;
     private ActionListener toolTipBtnListener;
    
     public MyButton() {
          super();
     }

     public JButton getToolTipButton() {
          if (toolTip != null) {
               return toolTip.getButton();
          } else {
               return null;
          }
     }
    
     public void addToolTipBtnListener(ActionListener l) {
          toolTipBtnListener = l;
     }
    
     public JToolTip createToolTip() {
          if (toolTip == null) {
               toolTip = new MyToolTip();
               toolTip.getButton().addActionListener(toolTipBtnListener);
          }
         
          return toolTip;
     }
}
 
2.3 测试主类
package test.ui.wnd;

import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JFrame;
import javax.swing.JTextField;

public class MyToolTipTest extends JFrame implements ActionListener {

     private static final long serialVersionUID = -8760252318430347150L;
     private MyButton mb;
     private JTextField jtf;
    
     public MyToolTipTest() {
          setSize(600,400);
          setLocation(200,200);
          setTitle("自定义ToolTip测试");
          setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
          Container c = getContentPane();
          c.setLayout(new FlowLayout(FlowLayout.CENTER));
         
          mb = new MyButton();
          mb.setText("Button");
          mb.addActionListener(this);
          mb.setToolTipText("这是一个自定义的ToolTip");
          mb.addToolTipBtnListener(this);
         
          jtf = new JTextField(20);
          c.add(mb);
          c.add(jtf);
     }

     @Override
     public void actionPerformed(ActionEvent e) {
          if (e.getSource() == mb) {
               jtf.setText("From \"Button\"");
          } else if (e.getSource() == mb.getToolTipButton()) {
               jtf.setText("From \"Push me\" in the tooltip");
          }
     }

     public static void main(String[] args) {
          MyToolTipTest test = new MyToolTipTest();
          test.setVisible(true);
     }

}
 
3 运行效果

    自己的ToolTip显示时的效果图

 

  

   响应ToolTip上组件的发出的事件

  • 大小: 30.6 KB
  • 大小: 31.2 KB
分享到:
评论
3 楼 i2534 2011-05-27  
很好.做swing就是这样.不要指望swing提供给你想要的,一切都要自己来.
2 楼 buaadu 2011-05-26  
顶,非常不错
1 楼 starry198804265811 2011-05-21  
这是我第一次发技术贴,请大家多多关照啊!

相关推荐

    37.(leaflet篇)leaflet叠加自定义tooltip展示.zip

    通过自定义tooltip,我们可以为地图上的特定元素提供更丰富的信息,使其更具吸引力和实用性。 首先,我们需要理解Leaflet中的基本概念。`L.Map`是核心地图对象,它管理着地图的视图、缩放级别和定位。`L.Marker`则...

    winform 自定义tooltip

    因此,自定义Tooltip应运而生,以提供更丰富的功能和定制化体验。 本项目名为“winform 自定义tooltip”,包含两个文件:BalloonTest和Balloon.NET。BalloonTest很可能是项目的测试程序,而Balloon.NET可能是一个...

    表格单元格自定义ToolTip组件

    "表格单元格自定义ToolTip组件"是一个专门解决UI交互问题的工具,它允许开发者根据需求为表格中的每个单元格提供更加详细和丰富的信息提示。这种自定义的ToolTip在Flex组件上特别有用,Flex是一种强大的富互联网应用...

    纯CSS3实现自定义Tooltip边框.rar_纯CSS3实现自定义Tooltip边框

    一款用纯CSS3打造的自定义Tooltip边框的应用,之前我们讨论过如何用CSS3来实现不同样式的Tooltip,今天的这款Tooltip却可以用CSS3来自定义边框,边框呈涂鸦风格。用CSS3实现自定义边框的好处是可以自适应边框内部的...

    自定义ToolTip

    在IT行业中,自定义ToolTip是一种常见的用户界面(UI)优化技术,主要用于提供额外的信息提示,增强用户体验。在标题“自定义ToolTip”中,我们聚焦于创建一个与Windows气泡提示相似的功能,允许显示图标和多行文字...

    3D地球+自定义tooltip,自定义样式完美显示

    总的来说,ECharts 3D地球结合自定义tooltip是一种强大的数据可视化工具,它能够帮助我们以直观且引人入胜的方式呈现复杂的地理数据。熟练掌握这一技术,对于提升Web应用的用户体验和数据传达效率有着显著的作用。

    Qt实现的自定义tip

    然而,为了使应用更具个性化或者满足特定需求,有时我们需要自定义tooltip的样式、形状和内容。 在“Qt实现的自定义tip”项目中,开发者可能面临以下几个关键步骤: 1. **创建自定义提示框类**:首先,我们需要...

    Flex 自定义ToolTip

    ### Flex自定义ToolTip详解 在Flex开发中,`ToolTip`是一种非常实用的界面元素,用于在用户悬停或聚焦某个控件时显示额外的信息。默认情况下,Flex提供了基本的`ToolTip`功能,但有时为了满足特定的设计需求或者...

    C# 使用GDI+绘制漂亮的ToolTip控件

    1. **创建自定义ToolTip类** 我们需要创建一个继承自System.Windows.Forms.ToolTip的类,如`CustomToolTip`,并在其中添加我们需要的新特性。例如,我们可以添加一个属性来存储自定义的图标,或者方法来设置背景...

    bettertip 一个可以自定义Tooltip的jQuery插件

    `BetterTip`是一个专为jQuery设计的插件,它允许开发者自定义Tooltip的样式、内容和行为,使其更加灵活,能够适应各种复杂的网页布局和交互需求。与jTip相比,`BetterTip`提供了更多的定制选项和更优秀的性能。 **1...

    c# ToolTip 几十种效果 集合了各种ToolTip 效果 很难得哦 源码

    【标题】中的“c# ToolTip 几十种...通过阅读和分析源代码,可以了解到如何自定义ToolTip的显示时间、样式、动画等特性,进一步提升开发技能。同时,也可以直接将这些效果应用到实际项目中,提高软件的易用性和美观性。

    Flash 自定义 ToolTip

    在“Flash自定义ToolTip”这个实例中,我们将学习以下知识点: 1. **ActionScript基础**:理解AS的基本语法和面向对象编程概念,包括类、对象、属性和方法。 2. **事件监听**:使用`addEventListener`方法监听鼠标...

    Jquery实现自定义tooltip示例代码

    ### Jquery实现自定义tooltip知识点详解 #### 知识点概述 本文档提供了一个使用Jquery实现自定义tooltip的示例代码。tooltip,即“提示工具”,是一种常见的用户交互元素,它在用户将鼠标悬停在特定元素上时显示...

    angularJS实现的tooltip效果

    然而,AngularJS提供了更高级的功能,使我们可以自定义tooltip的样式、行为以及何时何地显示。 要在AngularJS中实现tooltip,我们需要以下步骤: 1. **引入AngularJS库**:确保在你的HTML文件中已经包含了...

    echarts自作地图显示散点图 tooltip自定义内容

    要自定义Tooltip的内容,我们需要在`tooltip`配置项中进行设置。可以使用`formatter`函数来返回自定义的HTML字符串,这个字符串可以包含数据点的值、额外的描述信息,甚至可以嵌入图片或链接。在我们的场景中,...

    纯CSS3实现自定义Tooltip边框涂鸦风格的教程

    这是一款用纯CSS3打造的自定义Tooltip边框的应用,之前我们讨论过如何用CSS3来实现不同样式的Tooltip,今天的这款Tooltip却可以用CSS3来自定义边框,边框呈涂鸦风格。用CSS3实现自定义边框的好处是可以自适应边框...

    DuiLib 自绘鼠标提示窗口 tooltip

    4. **动画效果**:为了提升用户体验,自定义的tooltip可能会添加一些动态效果,如淡入淡出、平滑移动等。这需要开发者了解DuiLib的动画框架,并能编写相应的动画代码。 5. **内存管理和性能优化**:自绘tooltip可能...

    Qt5自定义实例化的QToolTip

    为了实现自定义的QToolTip,我们可以创建一个新的QWidget子类,例如名为CustomToolTip的类。这个类将继承自QWidget,并在其中实现我们所需的界面布局。在CustomToolTip类中,我们可以使用QVBoxLayout、QLabel、...

    46.(cesium篇)cesium实现信息提示tooltip.zip

    总之,通过Cesium的事件处理机制和DOM操作,我们可以方便地创建自定义的Tooltip,为用户提供更多有关地图上元素的上下文信息。这个过程需要对Cesium API有一定的了解,同时也需要掌握基本的HTML和CSS知识。在学习...

Global site tag (gtag.js) - Google Analytics