天天看点

如何自定义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代码

如何自定义ToolTip
如何自定义ToolTip
如何自定义ToolTip
  1. package test.ui.wnd;   
  2. import java.awt.Color;   
  3. import java.awt.Dimension;   
  4. import java.awt.Graphics;   
  5. import java.awt.Graphics2D;   
  6. import java.awt.Paint;   
  7. import javax.swing.JButton;   
  8. import javax.swing.JToolTip;   
  9. public class MyToolTip extends JToolTip {   
  10.      private static final long serialVersionUID = 1L;   
  11.      private JButton jb;   
  12.      public MyToolTip() {   
  13.           super();   
  14.           jb = new JButton("Push me!");   
  15.           jb.setLocation(10, 30);   
  16.           jb.setSize(100,30);   
  17.           add(jb);   
  18.      }   
  19.      public Dimension getPreferredSize() {   
  20.           return new Dimension(200,100);   
  21.      }   
  22.      public void paintComponent(Graphics g) {   
  23.           Graphics2D g2d = (Graphics2D)g;   
  24.           int width = (int)(getPreferredSize().getWidth());   
  25.           int height = (int)(getPreferredSize().getHeight());   
  26.           Paint oldPaint = g2d.getPaint();   
  27.           g2d.setPaint(Color.CYAN);   
  28.           g2d.fillRect(0, 0, width, height);   
  29.           g2d.setPaint(oldPaint);   
  30.           if (getTipText() != null) {   
  31.                g2d.drawString(getTipText(), 10, 20);   
  32.           }   
  33.      }   
  34.      public void paintChildren(Graphics g) {   
  35.           jb.repaint();   
  36.      }   
  37.      public JButton getButton() {   
  38.           return jb;   
  39.      }   
  40. }  
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 自定义一个组件 Java代码

如何自定义ToolTip
如何自定义ToolTip
如何自定义ToolTip
  1. package test.ui.wnd;   
  2. import java.awt.event.ActionListener;   
  3. import javax.swing.JButton;   
  4. import javax.swing.JToolTip;   
  5. public class MyButton extends JButton {   
  6.      private static final long serialVersionUID = -4212536258012660909L;   
  7.      private MyToolTip toolTip;   
  8.      private ActionListener toolTipBtnListener;   
  9.      public MyButton() {   
  10.           super();   
  11.      }   
  12.      public JButton getToolTipButton() {   
  13.           if (toolTip != null) {   
  14.                return toolTip.getButton();   
  15.           } else {   
  16.                return null;   
  17.           }   
  18.      }   
  19.      public void addToolTipBtnListener(ActionListener l) {   
  20.           toolTipBtnListener = l;   
  21.      }   
  22.      public JToolTip createToolTip() {   
  23.           if (toolTip == null) {   
  24.                toolTip = new MyToolTip();   
  25.                toolTip.getButton().addActionListener(toolTipBtnListener);   
  26.           }   
  27.           return toolTip;   
  28.      }   
  29. }  
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 测试主类 Java代码

如何自定义ToolTip
如何自定义ToolTip
如何自定义ToolTip
  1. package test.ui.wnd;   
  2. import java.awt.Container;   
  3. import java.awt.FlowLayout;   
  4. import java.awt.event.ActionEvent;   
  5. import java.awt.event.ActionListener;   
  6. import javax.swing.JFrame;   
  7. import javax.swing.JTextField;   
  8. public class MyToolTipTest extends JFrame implements ActionListener {   
  9.      private static final long serialVersionUID = -8760252318430347150L;   
  10.      private MyButton mb;   
  11.      private JTextField jtf;   
  12.      public MyToolTipTest() {   
  13.           setSize(600,400);   
  14.           setLocation(200,200);   
  15.           setTitle("自定义ToolTip测试");   
  16.           setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);   
  17.           Container c = getContentPane();   
  18.           c.setLayout(new FlowLayout(FlowLayout.CENTER));   
  19.           mb = new MyButton();   
  20.           mb.setText("Button");   
  21.           mb.addActionListener(this);   
  22.           mb.setToolTipText("这是一个自定义的ToolTip");   
  23.           mb.addToolTipBtnListener(this);   
  24.           jtf = new JTextField(20);   
  25.           c.add(mb);   
  26.           c.add(jtf);   
  27.      }   
  28.      @Override  
  29.      public void actionPerformed(ActionEvent e) {   
  30.           if (e.getSource() == mb) {   
  31.                jtf.setText("From \"Button\"");   
  32.           } else if (e.getSource() == mb.getToolTipButton()) {   
  33.                jtf.setText("From \"Push me\" in the tooltip");   
  34.           }   
  35.      }   
  36.      public static void main(String[] args) {   
  37.           MyToolTipTest test = new MyToolTipTest();   
  38.           test.setVisible(true);   
  39.      }   
  40. }  
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显示时的效果图

如何自定义ToolTip

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