JAVA Swing 如何自定义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的子类
Java代码   收藏代码
  1. package test.ui.wnd;  
  2.   
  3. import java.awt.Color;  
  4. import java.awt.Dimension;  
  5. import java.awt.Graphics;  
  6. import java.awt.Graphics2D;  
  7. import java.awt.Paint;  
  8. import javax.swing.JButton;  
  9. import javax.swing.JToolTip;  
  10.   
  11. public class MyToolTip extends JToolTip {  
  12.   
  13.      private static final long serialVersionUID = 1L;  
  14.      private JButton jb;  
  15.       
  16.      public MyToolTip() {  
  17.           super();  
  18.           jb = new JButton("Push me!");  
  19.           jb.setLocation(1030);  
  20.           jb.setSize(100,30);  
  21.           add(jb);  
  22.      }  
  23.       
  24.      public Dimension getPreferredSize() {  
  25.           return new Dimension(200,100);  
  26.      }  
  27.       
  28.      public void paintComponent(Graphics g) {  
  29.           Graphics2D g2d = (Graphics2D)g;  
  30.            
  31.           int width = (int)(getPreferredSize().getWidth());  
  32.           int height = (int)(getPreferredSize().getHeight());  
  33.           Paint oldPaint = g2d.getPaint();  
  34.           g2d.setPaint(Color.CYAN);  
  35.           g2d.fillRect(00, width, height);  
  36.           g2d.setPaint(oldPaint);  
  37.            
  38.           if (getTipText() != null) {  
  39.                g2d.drawString(getTipText(), 1020);  
  40.           }  
  41.            
  42.      }  
  43.       
  44.      public void paintChildren(Graphics g) {  
  45.           jb.repaint();  
  46.      }  
  47.       
  48.      public JButton getButton() {  
  49.           return jb;  
  50.      }  
  51.   
  52. }  
 
2.2 自定义一个组件
Java代码   收藏代码
  1. package test.ui.wnd;  
  2.   
  3. import java.awt.event.ActionListener;  
  4.   
  5. import javax.swing.JButton;  
  6. import javax.swing.JToolTip;  
  7.   
  8. public class MyButton extends JButton {  
  9.   
  10.      private static final long serialVersionUID = -4212536258012660909L;  
  11.       
  12.      private MyToolTip toolTip;  
  13.      private ActionListener toolTipBtnListener;  
  14.       
  15.      public MyButton() {  
  16.           super();  
  17.      }  
  18.   
  19.      public JButton getToolTipButton() {  
  20.           if (toolTip != null) {  
  21.                return toolTip.getButton();  
  22.           } else {  
  23.                return null;  
  24.           }  
  25.      }  
  26.       
  27.      public void addToolTipBtnListener(ActionListener l) {  
  28.           toolTipBtnListener = l;  
  29.      }  
  30.       
  31.      public JToolTip createToolTip() {  
  32.           if (toolTip == null) {  
  33.                toolTip = new MyToolTip();  
  34.                toolTip.getButton().addActionListener(toolTipBtnListener);  
  35.           }  
  36.            
  37.           return toolTip;  
  38.      }  
  39. }  
 
2.3 测试主类
Java代码   收藏代码
  1. package test.ui.wnd;  
  2.   
  3. import java.awt.Container;  
  4. import java.awt.FlowLayout;  
  5. import java.awt.event.ActionEvent;  
  6. import java.awt.event.ActionListener;  
  7.   
  8. import javax.swing.JFrame;  
  9. import javax.swing.JTextField;  
  10.   
  11. public class MyToolTipTest extends JFrame implements ActionListener {  
  12.   
  13.      private static final long serialVersionUID = -8760252318430347150L;  
  14.      private MyButton mb;  
  15.      private JTextField jtf;  
  16.       
  17.      public MyToolTipTest() {  
  18.           setSize(600,400);  
  19.           setLocation(200,200);  
  20.           setTitle("自定义ToolTip测试");  
  21.           setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  
  22.           Container c = getContentPane();  
  23.           c.setLayout(new FlowLayout(FlowLayout.CENTER));  
  24.            
  25.           mb = new MyButton();  
  26.           mb.setText("Button");  
  27.           mb.addActionListener(this);  
  28.           mb.setToolTipText("这是一个自定义的ToolTip");  
  29.           mb.addToolTipBtnListener(this);  
  30.            
  31.           jtf = new JTextField(20);  
  32.           c.add(mb);  
  33.           c.add(jtf);  
  34.      }  
  35.   
  36.      @Override  
  37.      public void actionPerformed(ActionEvent e) {  
  38.           if (e.getSource() == mb) {  
  39.                jtf.setText("From \"Button\"");  
  40.           } else if (e.getSource() == mb.getToolTipButton()) {  
  41.                jtf.setText("From \"Push me\" in the tooltip");  
  42.           }  
  43.      }  
  44.   
  45.      public static void main(String[] args) {  
  46.           MyToolTipTest test = new MyToolTipTest();  
  47.           test.setVisible(true);  
  48.      }  
  49.   
  50. }  
 
3 运行效果

    自己的ToolTip显示时的效果图

 

  

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


  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值