Hello Goodbye
Hello Goodbye

Reputation: 41

JPanel not showing label when its set to an array of icons, but will show when its a single icon

Current code

ThreeColorButton class: 

    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;

    public class ThreeColorButton {

    private static CompositeIcon icons = new CompositeIcon();
    private static JPanel panel = new JPanel();
    private static JFrame frame = new JFrame();
    private static JLabel label = new JLabel();

    public static void main(String[] args) {

        //create rgb buttons
        JButton redButton = new JButton("Red");
        JButton greenButton = new JButton("Green");
        JButton blueButton = new JButton("Blue");

        //add rgb buttons to panel
        panel.add(redButton);
        panel.add(greenButton);
        panel.add(blueButton);

        //add action listeners to buttons
        redButton.addActionListener(buttonListener(40, Color.red));
        greenButton.addActionListener(buttonListener(40, Color.green));
        blueButton.addActionListener(buttonListener(40, Color.blue));

        frame.setLayout(new BorderLayout());
        frame.add(panel, BorderLayout.NORTH);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        frame.pack();
        frame.setVisible(true);
    }
    private static ActionListener buttonListener(final int size,final Color color) {
        return new ActionListener() {
            public void actionPerformed(ActionEvent event) {
                SquareIcon icon = new SquareIcon(size, color);
                icons.addIcon(icon);
                label.setIcon(icons);

                frame.add(label, BorderLayout.SOUTH);

                frame.repaint();
                frame.pack();
            }
        };
    }
}

CompositeIcon code

    import javax.swing.*;
    import java.awt.*;
    import java.util.*;

    public class CompositeIcon implements Icon{

    private ArrayList<Icon> icons;
    private int size;

    public CompositeIcon() {
        icons = new ArrayList<Icon>();
    }

    public void paintIcon(Component c, Graphics g, int x, int y) {
        int position = x;
        for(Icon z : icons) {
            z.paintIcon(c,g,position,y);
            position = position + z.getIconWidth();
        }
    }
    public int getIconHeight() {
        return size;
    }
    public int getIconWidth() {
        int total = 0;
        for(Icon z : icons) {
            total = total + z.getIconWidth();
        }
        return total;
    }

    public void addIcon(Icon z) {
        icons.add(z);
    }

}

SquareIcon class is only a simple little class that creates a square of a single color with a given size.

My question is, in my ThreeColorButton class, when I run it, it doesn't show any icons when I press either of the RGB buttons. However, in the buttonListener method, if I set label.setIcons(icons) to label.setIcons(icon), it shows a single square and it doesnt place it side by side.

I can't seem to figure out whats causing this behavior. Is there a problem with displaying an array of icons using JLabel?

Upvotes: 0

Views: 82

Answers (2)

camickr
camickr

Reputation: 324128

There is nothing to paint in the label since the height of your Icon is 0, since you never set the size.

I would suggest code something like:

@Override
public int getIconHeight()
{
    int size = 0;

    for(Icon z : icons)
    {
        size = Math.max(size, z.getIconHeight());
    }

    return size;
}

You may want to check out Compound Icon. Similar to your class but it has more features. It supports horizontal/vertical/stacked icon and icon alignment options.

It doesn't support dynamically adding Icons so you would need to change that. I might looking adding that feature myself (when I get time) :)

Upvotes: 1

FredK
FredK

Reputation: 4084

I can't seem to figure out whats causing this behavior. Is there a problem with displaying an array of icons using JLabel? Yes, as @mKorbel mentioned, there is a problem. A JLabel can only display a single icon. If you want to display n icons, you will need n JLabel instances.

Upvotes: 0

Related Questions