无法使用 for 循环创建唯一按钮图标 Java
Failure to create unique button icons with for loop Java
我创建了一个 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();
}
}
不要共享一个 buffer-image
.create individual BufferImage
for each button.you 首先创建一个红色缓冲区图像并将其添加到按钮 1.and 然后你改变缓冲区图像变为蓝色。因为两个按钮共享相同的缓冲区图像,之前的按钮 1 图像图标颜色也变为蓝色。
试试 that.each 按钮有它自己的缓冲图像。
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)));
}
输出>>
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();
我创建了一个 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();
}
}
不要共享一个 buffer-image
.create individual BufferImage
for each button.you 首先创建一个红色缓冲区图像并将其添加到按钮 1.and 然后你改变缓冲区图像变为蓝色。因为两个按钮共享相同的缓冲区图像,之前的按钮 1 图像图标颜色也变为蓝色。
试试 that.each 按钮有它自己的缓冲图像。
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)));
}
输出>>
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();