[英]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
绕过这些限制基本上是驱动小部件几乎越过边缘。 一个干净的解决方案会滚动一个新组件。另一方面,OP 已经找到了要调整的螺丝。 唯一可以稍微改进的是既不调用 setXXSize,也不设置自定义 ui。 相反,通过覆盖 getXXSize() 使其表现得像一个容器,例如:
@Override
public Dimension getPreferredSize() {
if (getLayout() != null) {
return getLayout().preferredLayoutSize(this);
}
return super.getPreferredSize();
}
我建议使用JWindow
或 un_decorated JDialog
作为弹出窗口(默认用于JCalendar
或JDatePicker
)而不是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.