浏览 8753 次
锁定老帖子 主题:如何自定义ToolTip
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2011-05-21
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显示时的效果图
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2011-05-21
这是我第一次发技术贴,请大家多多关照啊!
|
|
返回顶楼 | |
发表时间:2011-05-26
顶,非常不错
|
|
返回顶楼 | |
发表时间:2011-05-27
很好.做swing就是这样.不要指望swing提供给你想要的,一切都要自己来.
|
|
返回顶楼 | |
发表时间:2011-10-18
看到了一篇实用的帖子 很好
|
|
返回顶楼 | |
发表时间:2011-10-18
默认是显示在鼠标下方,当提示位置接近屏幕底部时效果很差,lz知道ToolTip的定位吗?
|
|
返回顶楼 | |
发表时间:2011-10-31
http://blog.sina.com.cn/s/blog_4b6047bc01000aue.html
要懂得前人的经验,才能使自己快速前进。 |
|
返回顶楼 | |
发表时间:2012-03-01
不错,赞一个,希望楼主继续发表些原创帖!
|
|
返回顶楼 | |