工具提示中的可单击缩略图图像

时间:2014-10-09 14:49:40

标签: java image swing tooltip clickable

当用户将鼠标光标悬停在treetable中的特定项目上时,我希望显示一种特殊的工具提示。此工具提示将是PDF的缩略图,对应于光标指向的treetable中的项目。此外,我希望用户能够将光标移动到缩略图上并单击它,这应该在他们系统的默认PDF阅读器(Acrobat,Adobe Reader等)中打开完整的PDF。 )。

我意识到这是一项艰巨的任务,但我已经完成了大部分工作。我已经在我的庞大程序中找到了我需要setToolTip()方法的确切位置,以便它可以检索相应的缩略图。此外,由于我发现让Java在运行中创建缩略图非常困难,我已经设置了一些内容,因此会预先制作缩略图JPG。因此,所有setToolTip()命令都需要以某种方式检索相应的JPG。现在是困难的部分。

起初,这似乎很容易。我试过this really convenient hack for putting an image in a tooltip,它肯定会让缩略图正确显示。但是,使用锚标记<img>)围绕<a href="...">...</a>标记似乎并不起作用。缩略图被告诉蓝色边框包围,好吧,但图像仍然无法点击。此外,工具提示有时会在点击图像之前消失。

所以我认为我可能需要做一些比简单的html黑客更深入的事情。我试过this more involved way of putting an image in a tooltip,但似乎只适用于静态图像。我需要根据鼠标光标悬停的图像来区分图像。此外,如何设置我的方法以使用此工具提示的自定义版本&#39;而不是内置的?

为了给出更多的上下文,setToolTip()方法似乎工作的位置在getTreeCellRendererComponent()方法的内部,是扩展JPanel并实现{的自定义类的一部分{1}}。如果被问到我会发布代码,但它可能会相当复杂并且难以理解。有什么想法吗?

编辑10/09/2014,下午4:57:这些代码中的大部分都可能令人困惑,为此,我道歉。我只想说它与在JXTreeTable中放置一个三态复选框有关。无论如何,重要的部分应该很容易挑出来,我希望。如您所见,此类已扩展TreeCellRenderer,因此我也无法扩展JPanel

JToolTip

我知道我需要以某种方式扩展JToolTip,并且此SkyCheckTreeCellRenderer类需要以某种方式引用该自定义工具提示。我想所有这些只是变得如此复杂,以至于我的简单大脑无法绕过它。道歉。

2 个答案:

答案 0 :(得分:2)

  

如何设置我的方法以使用此工具提示的自定义版本&#39;而不是内置的?

如示例所示,您需要扩展组件以使用自定义工具提示。

  

我需要根据鼠标光标悬停的图像来区分图像

然后,您需要覆盖getToolTipText(MouseEvent)方法以返回文本字符串以表示您要显示的图像。

  

但是,使用锚标记(...)包围标记似乎无法正常工作

如果要回复超链接,则需要使用JEditorPane。阅读JEditorPane API以获取示例。

所以基本上我建议您需要使用自定义JToolTip,它使用JEditorPane来显示带有适当超链接的相应图像。下面是一个示例,说明如何将JLabel用作工具提示的附加组件。您应该能够修改代码以使用JEditorPane。

此外,您需要扩展树表以使用此自定义JToolTip。

import java.awt.*;
import java.awt.image.BufferedImage;
import java.net.URL;
import java.io.*;
import javax.imageio.ImageIO;
import javax.swing.*;

public class ToolTipImage extends JToolTip
{
    private Image image;

    public ToolTipImage(Image image)
    {
        this.image = image;

        setLayout( new BorderLayout() );
        add( new JLabel( new ImageIcon( image) ) );
    }

    @Override
    public Dimension getPreferredSize()
    {
        return new Dimension(image.getWidth(this), image.getHeight(this));
    }

    private static void createAndShowGUI() throws Exception
    {
        final BufferedImage testImage = ImageIO.read(new File("dukewavered.gif"));

        String[] columnNames = {"Column 0", "Column 1"};

        Object[][] data =
        {
            {"Cell 0,0", "Cell 0,1"},
            {"Cell 1,0", "Cell 1,1"}
        };

        JTable table = new JTable(data, columnNames)
        {
            public JToolTip createToolTip()
            {
                return new ToolTipImage( testImage );
            }
        };

        // Set tool tip text so that table is registered w/ tool tip manager
        table.setToolTipText(" ");

        JFrame frame = new JFrame("Tool Tip Image");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add( new JScrollPane(table) );
        frame.setLocationByPlatform( true );
        frame.pack();
        frame.setVisible( true );
    }

    public static void main(String[] args)
    {
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                try
                {
                    createAndShowGUI();
                }
                catch(Exception e) { System.out.println(e); }
            }
        });
    }
}

答案 1 :(得分:1)

听起来您需要构建自定义工具提示,如detailed in JToolTip

单击时,应使用Runtime从命令行打开文件。在Windows中执行此操作的方法是here。在ubuntu上执行此操作的方法是here