2011-10-27 19 views
10

que tienen un icono en un JLabel como se muestra a continuación:¿Dos íconos en un JLabel?

enter image description here

¿Es posible agregar otro icono (por ejemplo, una bandera que representa un país) entre el color del icono y el texto? Por ejemplo, deseo agregar un ícono que represente el indicador de EE. UU. Entre el ícono rojo y US. ¡Gracias!

Respuesta

19

Sí, el uso anidado JLabel con BoxLayout en la etiqueta del envase:

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); 
+1

Gracias, eso hizo el truco. También agregué 'container.add (Box.createRigidArea (new Dimension (5,0)))' para agregar algo de espacio entre los dos íconos. –

10

Probar CompoundIcon Editar: La solución basada en el diseño de Heisenbug es la respuesta trivial.

+3

o anide los contenedores en un diseño. o agregue otra columna en la lista solo para este propósito. – Randy

+0

+1 para implementar 'Icon'. – trashgod

+0

+1: gracias ... no sabía acerca de CompoundIcon .. – Heisenbug

5

que acabo de hacer esto recientemente - que quería ser capaz de combinar varios iconos en una sola fila en un único icono. La forma en que lo hice fue bajar al nivel BufferedImage y componer las dos imágenes manualmente en una sola imagen, y luego usar eso como mi icono JLabel. Hay otras maneras de lograr el mismo efecto, pero no quería tener que cambiar mi jerarquía de componentes de UI.

Terminé creando una clase que combina múltiples imágenes y las almacena en la caché. Lo utilicé como esto:

ImageIcon icon1 = ...; 
ImageIcon icon2 = ...; 

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

Aquí está la fuente:

/** 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<CachedCompositeIcon, ImageIcon> CACHED_ICONS = 
      new HashMap<CachedCompositeIcon, ImageIcon>(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; 
    } 
} 
3

esto es bastante posible, JLabel es Oscilación JComponent y se puede añadir cualquier JComponent a la otra JComponent, eso es igual para JLabel

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

si agrega fe JPanel a JLabel, entonces no se olvide de setOpaque(false);