【问题标题】:Failure to create unique button icons with for loop Java无法使用 for loop Java 创建唯一的按钮图标
【发布时间】:2015-04-17 03:24:38
【问题描述】:

我创建了一个 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();
    }

}

【问题讨论】:

    标签: java button for-loop icons


    【解决方案1】:

    不要为每个按钮共享一个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)));
            }
    

    输出>>

    【讨论】:

    • 是的!我通过从循环内的文件中手动重新加载 BufferedImage 来处理我的实际代码。非常感谢!
    【解决方案2】:

    似乎 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();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-06-17
      • 2012-04-01
      • 2020-09-29
      • 1970-01-01
      • 2022-01-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多