Как изменить цвет JPanel с помощью ActionListener из другого класса? - PullRequest
0 голосов
/ 15 марта 2019

У меня проблемы с изменением цвета Jpanel (mainPanel) в одном из моих классов с использованием ActionListener для переключателя в другом классе. У меня установлен цвет по умолчанию для основной панели, установленный на черный.

По существу у меня есть метод setMainPanel в моем первом классе:

public class MainBoard extends JFrame{

    public void setMainPanel(Color c){
        mainPanel.setBackground(c);
    }
}

Во втором классе у меня есть слушатель действия как:

private class MenuHandler implements ActionListener{
    public void actionPerformed(ActionEvent e){
        if(e.getSource() == exit) {
            System.exit(0);
        }else if(e.getSource() == blueBackground) {
            MainBoard mb = new MainBoard();
            mb.setMainPanel(Color.BLUE);
        }
    }
}

Моя команда System.exit будет работать, если я нажму «Выход» в моем меню. Концепция, которую я пытаюсь реализовать, состоит в том, чтобы иметь меню «Изменить цвет» с переключателями, где пользователь может изменить цвет на Черный или Синий. Я знаю, что это, вероятно, излишне, но мы пытаемся научиться вносить изменения в компоненты из разных классов. Спасибо за любую помощь!

1 Ответ

1 голос
/ 15 марта 2019

Ничего хорошего:

MainBoard mb = new MainBoard();  // this is not the currently displayed MainBoard
mb.setMainPanel(Color.BLUE);

Это типичная ошибка магического мышления для новичка в Java, когда вы думаете, что изменение состояния объекта класса магическим образом изменит состояние другого объекта того же класса.класс, но это не так, как работает Java.Вам нужно вызывать метод setMainPanel(...) для ссылки на текущий отображаемый или активный экземпляр MainBoard, а не какой-либо случайный новый и совершенно отдельный объект MainBoard, который вы создаете в этом методе и который никогда не отображается.

Поэтому передайте соответствующую ссылку в слушателя, возможно, используя что-то вроде:

private class MenuHandler implements ActionListener {
    MainBoard mainBoard;

    MenuHandler(MainBoard mainBoard) {
        this.mainBoard = mainBoard;
    }

    public void actionPerformed(ActionEvent e){
        if(e.getSource() == exit) {
            System.exit(0);
        }else if(e.getSource() == blueBackground) {
            // MainBoard mb = new MainBoard();
            mainBoard.setMainPanel(Color.BLUE);
        }
    }
}
...