2011-10-27 11 views
10

devo un'icona in una JLabel come illustrato di seguito:Due icone in una JLabel?

enter image description here

E 'possibile aggiungere un'altra icona (ad esempio una bandiera che rappresenta un paese) tra l'icona del colore e il testo? Ad esempio, desidero aggiungere un'icona raffigurante il flag USA tra l'icona rossa e US. Grazie!

risposta

19

Sì, uso annidati JLabel con BoxLayout nell'etichetta del contenitore:

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

Grazie, questo ha fatto il trucco. Ho anche aggiunto 'container.add (Box.createRigidArea (new Dimension (5,0)))' per aggiungere un po 'di spazio tra le due icone. –

10

Prova CompoundIcon Modifica: la soluzione basata su layout di Heisenbug è la risposta banale .

+3

o annidare i contenitori in un layout. o aggiungi un'altra colonna nella lista solo per questo scopo. – Randy

+0

+1 per l'implementazione di 'Icon'. – trashgod

+0

+1: grazie..don non so di CompoundIcon .. – Heisenbug

5

ho appena fatto questo di recente - volevo essere in grado di combinare più icone in una sola riga in una singola icona. Il modo in cui l'ho fatto è stato di scendere al livello BufferedImage e comporre manualmente le due immagini in un'unica immagine, e quindi usarla come icona JLabel. Esistono altri modi per ottenere lo stesso effetto, ma non volevo modificare la gerarchia dei componenti dell'interfaccia utente.

Ho finito per creare una classe che combina più immagini e le memorizza nella cache. L'ho usato in questo modo:

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

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

Ecco la fonte:

/** 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

questo è abbastanza possibile, JLabel è swing JComponent ed è possibile aggiungere qualsiasi JComponent alla un'altra JComponent, che è uguale per JLabel

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

se si aggiunge fe JPanel a JLabel quindi non dimenticare di setOpaque(false);