кнопка доступа в jpanel - PullRequest
       1

кнопка доступа в jpanel

0 голосов
/ 03 июня 2011

во время настройки эта функция называется

 private JPanel Defer()      
    {                    
        defer = new JPanel();
        defer.setLayout(new BoxLayout(defer, BoxLayout.Y_AXIS));
        JButton deferB = new JButton("Defer Staff Key Cutting");
        Color col = colour.getColour("White");
        deferB.setBackground(col);
        deferB.setActionCommand(def);
        deferB.addActionListener(this);
        defer.add(deferB); 
        return defer;
    }

Работает нормально и слушатель реагирует. Дело в том, что я хочу изменить цвет кнопки, когда она нажата, и позже, когда я пытаюсь использовать тот же код, который у меня здесь, для цвета, который она выдает, и исключение, утверждающее, что deferB не является реальным.

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

Как получить доступ к кнопке deferB, чтобы изменить ее цвет вне функции?

Также, если кто-нибудь может объяснить, как локальная переменная может использоваться в программе, как она используется, это было бы здорово, поскольку это не имеет смысла для меня.

Ответы [ 3 ]

4 голосов
/ 03 июня 2011

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

(JButton)event.getSource();

Из того, что я могу сказать из вашего кода, класс, в котором вы работаете, является слушателем действий.Это означает, что в вашем методе «actionPerformed (ActionEvent event)» вы хотите изменить цвет.(потому что это метод, который вызывается при щелчке. В этом методе вы можете либо выполнить event.getSource (), либо просто использовать имя переменной, если оно есть в качестве переменной экземпляра.

private JButton button_;

Дайте мне знать, если вам нужно больше разъяснений.

2 голосов
/ 03 июня 2011

Еще один совет, который не может ответить на ваш вопрос, но должен помочь исправить плохую практику программирования. В общем, не делайте этого:

deferB.addActionListener(this);

То, что вы делаете с этим фрагментом кода, делает ваш GUI слушателем, и это требует, чтобы класс GUI делал слишком много, и приводит к созданию слушателей действия "switchboard" с кучей if / else или большим оператор switch / case, в котором вы проверяете, соответствует ли команда source или action этой операции, или она равна foo do bar ... сложная вещь для настройки и сложная для отладки, изменения или расширения. Я думаю, что вам гораздо лучше дать каждой кнопке (или группе похожих кнопок) свой собственный слушатель, часто как анонимный внутренний класс или, если он более сложный, как частный внутренний класс или даже отдельный отдельный класс, что-то вроде этого:

deferB.addActionListener(new ActionListener() {
   actionPerformed(ActionEvent ae) {
      // the code for the event should go here 
   }
});
2 голосов
/ 03 июня 2011

Сохранить кнопку в поле.Добавьте это перед методом:

private JButton deferB;

и измените код в методе:

...
deferB = new JButton("Defer Staff Key Cutting");
...

Это позволит вам получить доступ к deferB в любом месте класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...