JLabel-da ikkita belgi bormi?

Menda JLabel-da pastdagi kabi bir belgi bor:

enter image description here

Rang belgisi va matn o'rtasida yana bir belgi (masalan, mamlakatni ifodalovchi) qo'shish mumkinmi? Misol uchun, AQSh bayrog'ini qizil ikonka va US o'rtasida tasvirlangan belgini qo'shishni xohlayman. Rahmat!

10

4 javoblar

Ha, konteyner yorlig'ida BoxLayout bilan ichki JLabeldan foydalaning:

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
qo'shib qo'ydi
Rahmat, bu hiyla-nayrang. Ikkala belgi orasida bo'sh joy qo'shish uchun container.add (Box.createRigidArea (new dimension (5.0))) ni qo'shdim.
qo'shib qo'ydi muallif BJ Peter DeLaCruz, manba

CompoundIcon ni sinab ko'ring Tartibga solish: Heisenbugning tuzilishga asoslangan echimi jiddiy javob.

10
qo'shib qo'ydi
+1: rahmat .. CompoundIcon haqida bilishmaydi.
qo'shib qo'ydi muallif Heisenbug, manba
haqiqiy emas, juda oddiy, asosiy narsalar
qo'shib qo'ydi muallif mKorbel, manba
Icon dasturini amalga oshirish uchun +1.
qo'shib qo'ydi muallif trashgod, manba
yoki konteynerlarni tartibda joylashtirish. yoki faqat shu maqsadda ro'yxatda boshqa ustun qo'shing.
qo'shib qo'ydi muallif Randy, manba

Men yaqinda bu ishni qildim - bir nechta belgilarni bitta satrda bitta belgiga birlashtirmoqchi bo'ldim. Men buni BufferedImage darajasiga tushirish va ikkita tasvirni bitta tasvirga qo'lda kiritish va keyin JLabel belgisi sifatida ishlatishim kerak edi. Xuddi shu natijaga erishishning boshqa usullari ham bor, lekin men UI tarkibiy qismlarining ierarxiyasini o'zgartirishni xohlamadim.

Men bir nechta tasvirlarni birlashtiradigan va ularni keshlashni o'z ichiga olgan sinf yaratishga kirishdim. Men buni shunday ishlatdim:

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

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

Manba:

/** 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
qo'shib qo'ydi

Bu juda mumkin, JLabel Swing JComponent va boshqa JComponentga JCLonentni qo'shishingiz mumkin, bu JLabel uchun bir xil

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

agar siz f.e ni qo'shsangiz. JPanelni JLabelga kiriting, keyin setOpaque (false); ni unutmang

3
qo'shib qo'ydi