自定义 Java 工具提示,其中 Swing 组件作为内容不显示

2022-09-03 16:57:20

我正在尝试在组件的工具提示中显示多个图像,找到并实现了一个自定义,该自定义添加了所需的组件,如下所示:createToolTip()

setComponent(component);

JPanel images = new JPanel(null);
images.setLayout(new BoxLayout(images, BoxLayout.X_AXIS));
for(ImageIcon icon:myIcons) {
    images.add(new JLabel(icon));
}

JPanel content = new JPanel(new BorderLayout());
content.add(new JLabel(title), BorderLayout.NORTH);
content.add(new JLabel(description));
content.add(images, BorderLayout.SOUTH);

add(content);

但是,我看到的只是一个小点,表示显示了工具提示,但不知何故忽略了大小。实现自定义工具提示时错过了什么?


答案 1

工具提示可以呈现 HTML。如果您可以形成图像的URL(如果它们是在内存中生成的,则不切实际,但通常可以这样做),那么编写一些将加载图像的HTML并使用该HTML作为工具提示是一件容易的事。


例如

MultiIconToolTip

import javax.swing.*;

class MultiIconToolTip {

    public static void main(String[] args) throws Exception {
        final String html =
            "<html><body>" +
            "<img src='" +
            "http://i.stack.imgur.com/OVOg3.jpg" +
            "' width=160 height=120> " +
            "<img src='" +
            "http://i.stack.imgur.com/lxthA.jpg" +
            "' width=160 height=120>" +
            "<p>Look Ma, no hands!";
        SwingUtilities.invokeLater( new Runnable() {
            public void run() {
                JLabel hover = new JLabel("Point at me!");
                hover.setToolTipText(html);
                JOptionPane.showMessageDialog(null, hover);
            }
        });
    }
}

答案 2

基本“问题”是JToolTip

  • 不是被设计成一个容器,它只是一个偶然的容器,因为JComponent是。对于 Swing “非容器”,ui 委托负责充当 LayoutManager。
  • 不够丰富,它可以处理文本(至少使用紧急门html,这是@Andrew的最爱:-)

绕过这些限制基本上是一种驱动,即小部件几乎越过了边缘。一个干净的解决方案将滚动一个新组件.另一方面,OP已经找到了要调整的螺钉。唯一可以稍微改进的是既不调用setXXSize,也不设置自定义UI。相反,通过覆盖 getXXSize() 使它表现得像一个容器,如下所示:

@Override
public Dimension getPreferredSize() {
    if (getLayout() != null) {
        return getLayout().preferredLayoutSize(this);
    }
    return super.getPreferredSize();
}