Twee pictogrammen in een JLabel?

Ik heb een pictogram in een JLabel zoals hieronder getoond:

enter image description here

Is het mogelijk om een ​​ander pictogram (bijvoorbeeld een vlag die een land vertegenwoordigt) toe te voegen tussen het kleurpictogram en de tekst? Ik wil bijvoorbeeld een pictogram toevoegen dat de Amerikaanse vlag weergeeft tussen het rode pictogram en VS . Bedankt!

10

4 antwoord

Ja, gebruik genest JLabel met BoxLayout in het containerlabel:

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);
20
toegevoegd
Bedankt, dat heeft de truc gedaan. Ik heb ook container.add (Box.createRigidArea (nieuwe dimensie (5,0))) toegevoegd om wat ruimte tussen de twee pictogrammen toe te voegen.
toegevoegd de auteur BJ Peter DeLaCruz, de bron

Probeer CompoundIcon Bewerken: de op lay-out gebaseerde oplossing van Heisenbug is de triviaal antwoord.

10
toegevoegd
+1: bedankt..ik wist niet van CompoundIcon ..
toegevoegd de auteur Heisenbug, de bron
niet waar, dat heel eenvoudige, basale gedoe
toegevoegd de auteur mKorbel, de bron
+1 voor het implementeren van pictogram .
toegevoegd de auteur trashgod, de bron
of nest de containers in een lay-out. of voeg een andere kolom in de lijst toe alleen voor dit doel.
toegevoegd de auteur Randy, de bron

Ik heb dit onlangs gedaan - ik wilde in één rij meerdere pictogrammen kunnen combineren tot een enkel pictogram. De manier waarop ik het deed was naar het niveau BufferedImage gaan en de twee afbeeldingen handmatig in één afbeelding samenstellen en dat dan gebruiken als mijn JLabel -pictogram. Er zijn andere manieren om hetzelfde effect te bereiken, maar ik wilde mijn UI-componenthiërarchie niet wijzigen.

Uiteindelijk heb ik een klasse gemaakt die meerdere afbeeldingen combineert en in de cache opslaat. Ik heb het zo gebruikt:

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

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

Hier is de bron:

/** 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;
    }
}
5
toegevoegd

dit is redelijk goed mogelijk, JLabel is Swing JComponent en je kunt elke JComponent toevoegen aan de andere JComponent, dat is hetzelfde voor JLabel

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

als u f.e. toevoegt JPanel aan het JLabel vergeet dan niet setOpaque (false); in te stellen

3
toegevoegd