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

Sil*_*eak 13 java layout swing tooltip

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

但是,我看到的只是一个小点,表示显示了工具提示,但不知何故忽略了大小.我错过了实施自定义工具提示的内容?

And*_*son 15

工具提示可以呈现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);
            }
        });
    }
}
Run Code Online (Sandbox Code Playgroud)


kle*_*tra 12

基本的"问题"是JToolTip

  • is-not design as a container,它只是偶然的容器,因为JComponent是.对于Swing"not-container",ui-delegate有责任充当LayoutManager.
  • 是不够丰富,它可以处理文本(至少与紧急门html,这是@Andrew的最爱:-)

绕过这些限制基本上是推动小部件几乎超越边缘.一个干净的解决方案将滚动一个新的组件..另一方面,OP已经找到螺丝进行调整.唯一可以略微改进的是既不调用setXXSize,也不设置自定义ui.相反,通过重写getXXSize()使其行为像容器:

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

  • 大!我在条件中添加了`!isPreferredSizeSet()`,现在正在使用这个变体! (3认同)