Изменение цвета иконки в JLabel - PullRequest
1 голос
/ 10 ноября 2019

Мне нужно сделать программу, которая показывает три кнопки в jframe вместе с изначально красным кружком. На трех кнопках должно быть написано: «КРАСНЫЙ», «ЗЕЛЕНЫЙ» и «СИНИЙ», а когда вы нажимаете кнопки, красный кружок должен измениться на тот цвет, на который вы нажали.

Сначала я попытался изменитьцвет значка, но я подумал, что было бы проще просто сделать три круга каждого цвета и добавить слушателя действия к каждой кнопке, который будет соответствовать правильному цветному кругу рамки, заменяя предыдущий, когда пользователь нажимает цвет,У меня проблемы с выяснением, как это сделать. Должен ли я сделать три отдельных класса для каждого круга? Или есть более простой способ?

Другое дело, я должен использовать JLabel, чтобы я мог вызывать метод repaint() в конце каждого изменения цвета, которое является частью проекта. Мне также нужно добавить статический метод в метод main, который возвращает слушатель действия, который я еще не выяснил, как это сделать.

Вот что у меня есть:

/**
 * 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);
    }

 }

Ответы [ 3 ]

2 голосов
/ 10 ноября 2019

Изменение цвета (переднего плана) 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);
0 голосов
/ 10 ноября 2019

Попробуйте следующее. Работает:

red.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent ae) {
        label.setForeground(Color.red);
    }
});
0 голосов
/ 10 ноября 2019

Просто код:

label.setForeground(Color.red);
...