无法使用for循环Java创建唯一的按钮图标

时间:2015-04-17 03:24:39

标签: java button for-loop icons

我创建了一个模仿我的代码问题的SSCCE。基本上我正在尝试创建一系列按钮,每个按钮显示相同的图像但具有不同的颜色。无论出于何种原因,所有按钮在结尾处都以相同的颜色结束,而且它始终是我使用的最后一种颜色。

以下是代码:

package buttonFail;

import java.awt.BorderLayout;
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Main extends Canvas{

    public static Color[] COLORS = {Color.red, Color.blue};

    Main() {
        JFrame frame = new JFrame();
        JPanel panel = new JPanel();

        BufferedImage img = new BufferedImage(32, 32, BufferedImage.TYPE_INT_RGB);
        Graphics2D g = img.createGraphics();
        g.setColor(Color.WHITE);
        g.fillOval(8, 8, 14, 14);


        for (int i = 0; i < COLORS.length; i++) {
            BufferedImage buffer = img;
            for (int y = 0; y < buffer.getHeight(); y++) {
                for (int x = 0; x < buffer.getWidth(); x++) {
                    if ((buffer.getRGB(x, y) & 0x00FFFFFF) != 0x00000000) {
                        buffer.setRGB(x, y, COLORS[i].getRGB());
                    }
                }
            }
            panel.add(new JButton(new ImageIcon(buffer)));
        }

        frame.add(this);
        frame.add(panel);
        frame.pack();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
        panel.setFocusable(true);
        panel.requestFocusInWindow();

    }

    public static void main(String[] args) {
        new Main();
    }

}

2 个答案:

答案 0 :(得分:0)

不要为每个按钮共享一个buffer-image。创建个人BufferImage。首先创建一个红色缓冲区图像并将其添加到按钮1.然后将缓冲区图像更改为蓝色。由于两个按钮共享相同的缓冲图像,因此前一个按钮1图像图标颜色也变为蓝色。

试试那个按钮有它自己的缓冲图像。

 for (int i = 0; i < COLORS.length; i++) {

            BufferedImage img = new BufferedImage(32, 32, BufferedImage.TYPE_INT_RGB);
            BufferedImage buffer = img;
            Graphics2D g = img.createGraphics();
            g.setColor(Color.WHITE);
            g.fillOval(8, 8, 14, 14);

            for (int y = 0; y < buffer.getHeight(); y++) {
                for (int x = 0; x < buffer.getWidth(); x++) {
                    if ((buffer.getRGB(x, y) & 0xFF000000) == 0xFF000000) {
                        buffer.setRGB(x, y, COLORS[i].getRGB());
                    }
                }
            }
            panel.add(new JButton(new ImageIcon(buffer)));
        }

输出&GT;&GT;

enter image description here

答案 1 :(得分:0)

看起来像Image对象的引用是一样的。这是我修改过的代码。

JFrame frame = new JFrame();
JPanel panel = new JPanel();

for (int i = 0; i < COLORS.length; i++) {
    BufferedImage buffer = new BufferedImage(32, 32, BufferedImage.TYPE_INT_RGB);
    Graphics2D g = buffer.createGraphics();
    g.setColor(Color.WHITE);
    g.fillOval(8, 8, 14, 14);
    for (int y = 0; y < buffer.getHeight(); y++) {
        for (int x = 0; x < buffer.getWidth(); x++) {
            if ((buffer.getRGB(x, y) & 0xFF000000) == 0xFF000000) {
                buffer.setRGB(x, y, COLORS[i].getRGB());
            }
        }
    }
    panel.add(new JButton(new ImageIcon(buffer)));
}

frame.add(this);
frame.add(panel);
frame.pack();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
panel.setFocusable(true);
panel.requestFocusInWindow();