gpt4 book ai didi

java - 更改 JLabel 中图标的颜色

转载 作者:行者123 更新时间:2023-11-30 01:44:10 24 4
gpt4 key购买 nike

我需要制作一个程序,在 jframe 中显示三个按钮以及一个最初的红色圆圈。这三个按钮必须显示“红色”、“绿色”和“蓝色”,当您单击这些按钮时,红色圆圈应更改为您单击的任何颜色。

起初,我尝试实际更改图标的颜色,但我认为将三个圆圈分别设置为不同的颜色并向每个按钮添加一个 Action 监听器会更容易,这会将正确的颜色圆圈添加到框架中每当用户单击一种颜色时,都会替换之前的颜色。我不知道该怎么做。我应该为每个圈子开设三个单独的类(class)吗?或者有更简单的方法吗?

另一件事是,我必须使用 JLabel,这样我就可以在项目中每次颜色更改结束时调用 repaint() 方法。我还需要在主方法中添加一个静态方法,该方法返回一个 Action 监听器,我还没有弄清楚如何做。

这是我到目前为止所拥有的:

/**
* Write a description of class CircleIcon here.
*
* @author (your name)
* @version (a version number or a date)
*/
import java.awt.*;
import java.awt.geom.*;
import javax.swing.*;

public class CircleIcon implements Icon
{
// Instance variables - replace the example below with your own

/**
* Constructor for objects of class CircleIcon
*/
private int size;

public CircleIcon(int aSize)
{
// Initialise instance variables
size = aSize;
}

public int getIconWidth() {
return size;
}

public int getIconHeight() {
return size;
}

public void paintIcon(Component c, Graphics g, int x, int y) {
Graphics2D g2 = (Graphics2D) g;
Ellipse2D.Double circle = new Ellipse2D.Double(x, y, size, size);
g2.setColor(Color.RED);
g2.fill(circle);
}
}

CircleIconTester 类:

/**
* Write a description of class CircleIconTester here.
*
* @author (your name)
* @version (a version number or a date)
*/
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.awt.geom.*;
import java.awt.color.*;

public class CircleIconTester
{
public static void main(String[] args) {
JFrame frame = new JFrame();

CircleIcon circle = new CircleIcon(50);
JLabel label = new JLabel(circle);
frame.add(label);

JButton red = new JButton("RED");
JButton blue = new JButton("BLUE");
JButton green = new JButton("GREEN");
frame.add(red);
frame.add(blue);
frame.add(green);

ActionListener redAL = new ActionListener() {
public void actionPerformed(ActionEvent event) {
}
};

red.addActionListener(redAL);

frame.setLayout(new FlowLayout());

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}

}

最佳答案

更改 JLabel 的(前景)颜色只需调用 JLabel 对象上的 setForeground(...) 方法即可。但是您的图标实现必须获取其所在组件的属性。幸运的是,paintIcon() 方法返回图标所在的父组件。请参阅 documentation of paintIcon() :

void paintIcon(Component c,
Graphics g,
int x,
int y)

Draw the icon at the specified location. Icon implementations may use the Component argument to get properties useful for painting, e.g. the foreground or background color.

文档甚至提到您可以使用它来获取颜色。在 paintIcon() 方法中,您可以使用 getForeground() 方法来获取 JLabel 的前景色。

public void paintIcon(Component c, Graphics g, int x, int y){
Graphics2D g2 = (Graphics2D) g;
Ellipse2D.Double circle = new Ellipse2D.Double(x, y, size, size);
g2.setColor(c.getForeground()); // <-- get foreground color from parent.
g2.fill(circle);
}

现在您必须在 Action 监听器中设置正确的前景色。当您想使用静态方法构建 Action 监听器时,您可以这样做。创建一个新的静态方法BuildActionListener,它获取两个参数。一种用于更改 JLabel 对象,另一种用于使用前景色。它返回一个 ActionListener 对象,该对象会更改前景色:

/**
* Build an action listener to change the color of the label.
*
* @param label The label to change.
* @param color The color to use.
* @returns The action listener which changes the color.
*/
public static ActionListener BuildActionListener(JLabel label, Color color) {
return new ActionListener(){
public void actionPerformed(ActionEvent event){
label.setForeground(color);
}
};
}

使用此帮助器方法为每个按钮分配自定义操作监听器:

red.addActionListener(BuildActionListener(label, Color.RED));
blue.addActionListener(BuildActionListener(label, Color.BLUE));
green.addActionListener(BuildActionListener(label, Color.GREEN));

要从红色圆圈(而不是黑色圆圈)开始,请在开头的某个位置设置标签的前景色:

JLabel label = new JLabel(circle);
label.setForeground(Color.RED);

关于java - 更改 JLabel 中图标的颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58786828/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com