- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我需要制作一个程序,在 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/
我已经创建了一个蛇梯游戏,它运行良好,但现在我想对其进行一些修改。我希望每个玩家都有两个棋子/玩家而不是一个。现在的新规则变成,同一玩家的两个棋子可以占据同一个方 block ,因此我需要一种方法将它
抱歉标题含糊不清,但我想不出我想在标题中做什么。无论如何,对于图像上的文本,我使用了 JLabel 文本并将其添加到图标中。 JLabel icon = new JLabel(new Imag
我想将我的私有(private) jlabel 对象复制到一个新的 jlabel 对象并将新的 jlabel 对象公开。想法是允许任何人访问 jlabel 的属性,但不允许进行任何将显示在原始界面上的
我有一个由二维 int 数组组成的网格。 基本包含00、01、02等,无需赘述。 我有一种提取网格位置的方法,然后使用字符串生成器操作字符串,将其更改为“jxy”(x = 网格中的 x 位置,y =
我目前正在尝试将 tabIconLabels(即 JLabels)放在更大的 JLabel(tabAreaLabel)上(所有标签都附加有 ImageIcon)。我尝试使用 OverlayLayout
我一直在尝试将一个 JLabel 放在另一个 Roguelike 之上。不幸的是,它似乎不起作用。到目前为止,这是我的代码: public void updateDraw(int direction)
我正在为 Tic Tac Toe 项目开发 GUI,其中我希望在单击相应区域时显示图像(玩家的移动)。但是,我不知道如何在另一个 JLabel(背景)之上显示 JLabel(移动)。 我已经搜索并尝试
public void movePiece(JLabel destination){ JLabel currentPiece = piece[oldIndex[0]][oldIndex[1]];
我在这方面遇到了障碍,希望能得到一些见解。 这是我想要实现的基本要点: -我有一个 piece 类(扩展 JPanel),它有一个 JRadioButton 数组,以及一个 JLabel 根据选择的按
我有一个名为 iconLabel 的类,它扩展 JLabel 来制作按钮。我使用 Font Awesome 字体将 JLabel 的文本设置为图标。我还在构造函数中向 iconLabel 对象添加了另
我对Java真的很陌生,我想制作一个简单的GUI,其中有一个按钮,当你点击它时就会计数,我遵循this YouTube 上的教程即可实现这一目标。一切都很顺利,一切都很顺利。但有一件事没有,JLabe
假设我有一个 JLabel 大小 20x20。现在假设我添加了字符串“The Quick Brown Fox Jumps Over the Lazy Dog”。这句话对于 JLabel 来说太长,因此
我有以下代码: try { File file_background = new File( "C:\\Users\\xxxx\\Desktop\\ba
我使用 netbean 创建了一个 jframe,并向该 jframe 添加了一个 jlabel (changeLbl)。之后,我向该 jframe 添加了一个 jbutton。现在我需要创建一个新的
Game(){ JFrame frame = new JFrame("Display Image"); JPanel panel = (JPanel)frame.getContentP
我在 swing 中使用带有图标的 Jlabel。我从我的计算机中选择了一个图像作为图标,但我找不到一种方法让它自动调整为 Jlabel 的大小。因为我想要的图像比 Jlabel 的大小大得多,所以我
是否可以在另一个 JLabel 之上添加一个 JLabel?谢谢。 最佳答案 简短的回答是肯定的,因为 JLabel是 Container , 所以它可以接受 Component (JLabel 是
我试图在我的 GUI 中显示卡片,我想重叠卡片以节省空间。但是,我似乎无法让它工作。我目前正在使用 MigLayout,尽管感觉它更像是一个 JLabel 问题而不是其他问题。 要从高层次来描述它,请
我正在将布局设置为 null,我有一个具有宽高比的 JFrame,并且在调整大小期间,该框架保持相同的宽高比。 每次我调整框架大小时,我都会调整所有组件的大小,没有任何问题,只是使用 JLabel 调
现在,我正在开发另一个 JPanel与 9 JLabel每个分配有不同的 Color 。应用程序要做的是,当用户单击第一个面板时,除了 JLabel 的颜色发生变化之外,不会发生任何事情。将被注册到实
我是一名优秀的程序员,十分优秀!