Изменение цвета (переднего плана) JLabel
- это простой вызов метода setForeground(...)
для объекта JLabel
. Но ваша реализация значков должна получить свойства компонента, в котором она находится. К счастью, метод paintIcon()
возвращает родительский компонент, в котором находится значок. См. Документацию paintIcon()
:
void paintIcon(Component c,
Graphics g,
int x,
int y)
Нарисуйте значок в указанном месте. Реализации значков могут использовать аргумент Component для получения свойств, полезных для рисования, например, цвета переднего плана или фона.
В документации даже упоминается, что вы можете использовать его для получения цвета. Внутри вашего 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);
}
Теперь вы должны установить правильный цвет переднего плана в вашем слушателе действия. Если вы хотите создать слушатель действия статическим методом, вы можете это сделать. Создайте новый статический метод 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);