Дві піктограми в JLabel?

У мене є значок в JLabel, як показано нижче:

enter image description here

Можна додати ще одну піктограму (наприклад, прапор, що представляє країну) між значком кольору та текстом? Наприклад, я хочу додати піктограму з зображенням прапору США між червоною піктограмою та US . Дякую!

10

4 Відповіді

Так, використовуйте вкладену 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);
20
додано
Спасибі, що зробив трюк. Я також додав container.add (Box.createRigidArea (новий вимір (5,0))) , щоб додати пробіл між двома піктограмами.
додано Автор BJ Peter DeLaCruz, джерело

Спробуйте CompoundIcon Редагувати: рішення на базі макета Heisenbug - це тривіальна відповідь

10
додано
+1: дякую ... не знаю про CompoundIcon ..
додано Автор Heisenbug, джерело
Неправда, це дуже простий можливий, основний матеріал
додано Автор mKorbel, джерело
+1 для реалізації Icon .
додано Автор trashgod, джерело
або гніздять контейнери у макеті. або додайте інший стовпець у списку саме для цієї мети.
додано Автор Randy, джерело

Я щойно зробив це останнім часом - я хотів, щоб можна було об'єднати кілька іконок в одному рядку на одній піктограмі. Спосіб, яким я це робив, полягає в тому, щоб перейти до рівня BufferedImage і скласти два зображення вручну в одному зображенні, а потім використовувати його як мій JLabel значок. Існують й інші способи досягнення такого ж ефекту, але я не хотів змінювати ієрархію компонентів інтерфейсу користувача.

Я закінчив створення класу, який поєднує в собі декілька зображень і кешує їх. Я використовував це так:

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;
    }
}
5
додано

це досить можливо, JLabel - Swing JComponent, і ви можете додати будь-який JComponent до іншого JComponent, це те саме для JLabel

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

якщо ви додаєте f.e. Тоді не забудьте setOpaque (false);

3
додано
ІТ КПІ - Java
ІТ КПІ - Java
436 учасників