繁体   English   中英

将 Swing 组件作为内容的自定义 Java 工具提示不显示

[英]Custom Java tool tip with Swing components as content does not show up

我试图在组件的工具提示中显示多个图像,找到了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);

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

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


例如

多图标工具提示

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);
            }
        });
    }
}

基本的“问题”是 JToolTip

  • is-not设计为容器,它只是偶然的容器,因为 JComponent 是。 对于 Swing “非容器”,它的 ui 委托有责任充当 LayoutManager。
  • 不够丰富,它只能处理文本(至少对于紧急门 html,这是@Andrew 的最爱 :-)

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

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

我建议使用JWindow或 un_decorated JDialog作为弹出窗口(默认用于JCalendarJDatePicker )而不是JTooltip ,以便更好地输出到 GUI 实现Translucent 和 Shaped Windows


注意:如果您使用 JDK 1.6 或更早版本,请改用此方法 它仅适用于 SUN JDK。

听起来可能很傻,但是,您是否尝试过为JPanel设置边界?

setBounds(100, 100, 150, 50);

您可以尝试在BorderLayout 设置组件之间的间隙

JPanel content = new JPanel(new BorderLayout(1,1));

基本上缺少两件事。 首先, JToolTip扩展了JComponent ,与JPanel不同,它没有默认布局。 要在工具提示上拉伸content ,请使用BorderLayout

setLayout(new BorderLayout());

第二个问题是尺寸。 ToolTipManager尊重工具提示的首选大小。 BorderLayout计算大小时, ToolTipUI忽略它。 因此,有两种选择:手动设置首选大小...

setPreferredSize(content.getPreferredSize());

请注意,这不会使布局过时; 否则,您会得到一个大小合适的空工具提示。

...或子类ToolTipUI以尊重布局,这就是我所采用的。 结果代码是:

setComponent(StadtLabel.this);

JPanel images = new JPanel(null);
waren.setLayout(new BoxLayout(waren, BoxLayout.X_AXIS));
for(ImageIcon icon:myIcons) {
    JLabel lbl = 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);

setLayout(new BorderLayout());
add(content);
setUI(new ToolTipUI() {
    @Override
    public Dimension getMinimumSize(JComponent c) {
        return c.getLayout().minimumLayoutSize(c);
    }

    @Override
    public Dimension getPreferredSize(JComponent c) {
        return c.getLayout().preferredLayoutSize(c);
    }

    @Override
    public Dimension getMaximumSize(JComponent c) {
        return getPreferredSize(c);
    }
});

与其重新发明轮子,不如试试这个: https : //github.com/timmolderez/balloontip 您可以将任何内容作为 JComponent。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM