JLabel中的两个图标?

我在JLabel中有一个图标,如下所示:

在此处输入图像描述

是否可以在颜色图标和文本之间添加另一个图标(例如,代表国家的标志)? 例如,我想在红色图标和US之间添加一个描绘美国国旗的图标。 谢谢!

是的,在容器标签中使用嵌套的JLabel和BoxLayout:

 JLabel container = new JLabel(); container.setLayout(new BoxLayout(container, BoxLayout.X_AXIS)); JLabel icon1Label = new JLabel(); JLabel icon2Label = new JLabel(); icon1Label.setIcon(icon1); icon2Label.setIcon(icon2); container.add(icon1Label); container.add(icon2Label); 

试试CompoundIcon Edit:Heisenbug基于布局的解决方案是一个简单的答案。

我最近刚刚做了这个 – 我希望能够将一行中的多个图标组合成一个图标。 我这样做的方法是下到BufferedImage级别并手动将两个图像组合成一个图像,然后将其用作我的JLabel图标。 还有其他方法可以实现相同的效果,但我不想更改我的UI组件层次结构。

我最终创建了一个组合多个图像并缓存它们的类。 我用它是这样的:

 ImageIcon icon1 = ...; ImageIcon icon2 = ...; ImageIcon labelIcon = new CachedCompositeIcon( icon1, icon2 ).getIcon(); jLabel.setIcon( labelIcon ); 

这是来源:

 /** This is a convenience class to handle creating a single composite icon from several icons, and caching the * created icons to eliminate duplicate work. This class is basically used as a key into a map, allowing us to * define both a hashCode and equals in a single place. */ public class CachedCompositeIcon { private static final byte ICON_PADDING = 2; private static final HashMap CACHED_ICONS = new HashMap( 4 ); private final ImageIcon[] m_icons; public CachedCompositeIcon(final ImageIcon... icons) { m_icons = icons; } public ImageIcon getIcon() { if ( !CACHED_ICONS.containsKey( this ) ) { CACHED_ICONS.put( this, lcl_combineIcons() ); } return CACHED_ICONS.get( this ); } /** Generates an icon that is a composition of several icons by appending each icon together with some * padding between them. * * @return An icon that is the concatenation of all the icons this was constructed with. */ private ImageIcon lcl_combineIcons() { // First determine how big our composite icon will be; we need to know how wide & tall to make it. int totalWidth = (m_icons.length - 1) * ICON_PADDING; // Take into account the padding between icons int minHeight = 0; for ( int i = 0; i < m_icons.length; ++i ) { totalWidth += m_icons[i].getIconWidth(); if ( m_icons[i].getIconHeight() > minHeight ) { minHeight = m_icons[i].getIconHeight(); } } // Create an image big enough and acquire the image canvas to draw on final BufferedImage compositeImage = new BufferedImage( totalWidth, minHeight, BufferedImage.TYPE_INT_ARGB ); final Graphics graphics = compositeImage.createGraphics(); // Iterate over the icons, painting each icon and adding some padding space between them int x = 0; for ( int i = 0; i < m_icons.length; ++i ) { final ImageIcon icon = m_icons[ i ]; graphics.drawImage( icon.getImage(), x, 0, null ); x += icon.getIconWidth() + ICON_PADDING; } return new ImageIcon( compositeImage ); } /** Generates a hash that takes into account the number of icons this composition includes and the hash & * order of those icons. * * @return A hash code. */ @Override public int hashCode() { int weakHash = m_icons.length; for ( int i = 0; i < m_icons.length; ++i ) { weakHash += m_icons[i].hashCode() * (i + 1); } return weakHash; } /** Two instances are equal if and only if they include the same icons and they're in the same order. * * @param obj An object to check for equality with this. * * @return true if the two objects are equal, false otherwise. */ @Override public boolean equals(final Object obj) { if ( !(obj instanceof CachedCompositeIcon) ) { return false; } final CachedCompositeIcon other = (CachedCompositeIcon) obj; if ( m_icons.length != other.m_icons.length ) { return false; } for ( int i = 0; i < m_icons.length; ++i ) { if ( m_icons[i].hashCode() != other.m_icons[i].hashCode() ) { return false; } } return true; } } 

这很可能,JLabel是Swing JComponent,你可以将任何JComponent添加到另一个JComponent,这对JLabel来说是一样的

 label.setLayout(new GridLayout(0, 2, 10, 10)); label.add(myIcon1); label.add(myIcon2); 

如果你将fe JPanel添加到JLabel,那么不要忘记setOpaque(false);