ActionListener - Радио кнопки

1

Я пытаюсь заставить программу работать, когда вы нажимаете конкретный переключатель, который говорит о цвете на нем, и он делает всю страницу такой. Окно открывается как квадрат с 4 различными цветовыми опциями. Я просто не могу, чтобы жизнь меня заставила работать actionPerformed. Вот мой код. Любая помощь приветствуется.

public class ColorPanel3 extends JPanel implements ActionListener {

Color darkBlue = new Color(5,41,186);
Color lightBlue = new Color(35,253,253);
Color darkRed = new Color(158,19,47);
Color lightRed = new Color(255,105,105);


JRadioButton lightRedButton = new JRadioButton("Light Red");
JRadioButton darkBlueButton = new JRadioButton("Dark Blue");
JRadioButton lightBlueButton = new JRadioButton("Light Blue");
JRadioButton darkRedButton = new JRadioButton("Dark Red");

public  ColorPanel3() {
    setName("Color Panel");
    setLayout(new GridLayout(1, 0, 0, 0));
    JPanel panel = new JPanel();
    add(panel);
    panel.setLayout(null);
    panel.setOpaque(true);

    lightRedButton.setHorizontalAlignment(SwingConstants.CENTER);
    lightRedButton.setBounds(0, 150, 150, 150);
    lightRedButton.setBackground(lightRed);
    panel.add(lightRedButton);


    darkBlueButton.setHorizontalAlignment(SwingConstants.CENTER);
    darkBlueButton.setBounds(0, 0, 150, 150);
    darkBlueButton.setBackground(darkBlue);
    panel.add(darkBlueButton);


    lightBlueButton.setHorizontalAlignment(SwingConstants.CENTER);
    lightBlueButton.setBounds(150, 0, 150, 150);
    lightBlueButton.setBackground(lightBlue);
    panel.add(lightBlueButton);

    darkRedButton.setHorizontalAlignment(SwingConstants.CENTER);
    darkRedButton.setBounds(150, 150, 150, 150);
    darkRedButton.setBackground(darkRed);

    panel.add(darkRedButton);

    ButtonGroup group = new ButtonGroup();   //creates a button group so that only one radio button may be pressed at a time.
    group.add(darkBlueButton);
    group.add(lightBlueButton);
    group.add(darkRedButton);
    group.add(lightRedButton);

    lightRedButton.addActionListener(actionListener);
    darkRedButton.addActionListener(actionListener);
    lightBlueButton.addActionListener(actionListener);
    darkBlueButton.addActionListener(actionListener);

}

ActionListener actionListener = new ActionListener(){
    public void actionPerformed (ActionEvent e){


        if(darkBlueButton.isSelected()){
            darkBlueButton.setBackground(darkBlue);
            lightBlueButton.setBackground(darkBlue);
            lightRedButton.setBackground(darkBlue);
            darkRedButton.setBackground(darkBlue);
        }

        if(lightBlueButton.isSelected()){
            darkBlueButton.setBackground(lightBlue);
            lightBlueButton.setBackground(lightBlue);
            lightRedButton.setBackground(lightBlue);
            darkRedButton.setBackground(lightBlue);
        }

        if(darkRedButton.isSelected()){
            darkBlueButton.setBackground(darkRed);
            lightBlueButton.setBackground(darkRed);
            lightRedButton.setBackground(darkRed);
            darkRedButton.setBackground(darkRed);
        }

        if(lightRedButton.isSelected()){
            darkBlueButton.setBackground(lightRed);
            lightBlueButton.setBackground(lightRed);
            lightRedButton.setBackground(lightRed);
            darkRedButton.setBackground(lightRed);
        }
    }       

И я создал новый файл класса, чтобы включить панель. Это сработало.

public class ColorFrame{
public static void main(String[] args) {
    JFrame frame = new JFrame();
    frame.add(new ColorPanel3());
    frame.setVisible(true);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setTitle("Color Frame");

}

}
    };

}

Окончательное редактирование: приведенный выше код - это то, с чем я закончил.

  • 0
    Попробуйте добавить System.out.println(1); В действии выполните часть, чтобы проверить, где она работает нормально, затем добавьте эту информацию к вашему вопросу, и я смогу вам помочь. Еще одна вещь, вы пытаетесь изменить фон окна или переключателя?
  • 0
    Что вы ожидаете, и что на самом деле происходит?
Показать ещё 8 комментариев
Теги:
swing
actionlistener

2 ответа

1

Ваш слушатель действия должен выглядеть следующим образом:

ColorPanel3.setOpaque(true);
ColourPanel3.this.setBackground(yourcolor);

И более того, если вы не пишете этот код для обфускации кода, пожалуйста, используйте разные исполнители действий для всех переключателей.

Приветствия.

Изменить: вам нужно будет добавить панель в JFrame

  • 0
    ColorPanel3.setOpaque(false); На непрозрачной панели цвет фона не будет виден. please use different actionlisteners Это действительно вопрос предпочтений, который также зависит от приложения. Можно уставать от написания addActionListener снова и снова, особенно если действия нескольких кнопок похожи.
  • 0
    @TNT Первое, что вы сказали, было правильно, что ColorPanel3.setOpaque(false); неправильно. Во второй части использование разных слушателей действий является очень хорошей идеей, поскольку позволяет избежать запутывания кода, но, как вы сказали, это вопрос предпочтений.
Показать ещё 4 комментария
0

Прежде всего, избавьтесь от этих строк:

JRadioButton darkBlueButton = (JRadioButton) e.getSource();
JRadioButton lightBlueButton = (JRadioButton) e.getSource();
JRadioButton darkRedButton = (JRadioButton) e.getSource();
JRadioButton lightRedButton = (JRadioButton) e.getSource();

JRadioButton что вы создаете четыре экземпляра JRadioButton со ссылкой на JRadioButton, заданные e.getSource(). Если вы хотите, чтобы фон менял цвет, это необязательно. Я чувствую, что эффект от этого не то, что вы намеревались сделать, так или иначе.

При создании объектов JRadioButton с конструктором, который принимает String, вы даете ему ярлык (т. JRadioButton Темно-синий) вместе с командой действий, которая совпадает с текстом. Вы можете воспользоваться этим, используя getActionCommand метод ActionEvent класса, чтобы определить, какой цвет должен быть JPanel:

if (e.getActionCommand().equals("Dark Blue")) {
    ColorPanel3.this.setBackground(darkBlue);
}

Но для того, чтобы любое изменение цвета стало очевидным, вы должны установить прозрачность верхней панели:

panel.setOpaque(false);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню