Анонимный класс Java, который реализует ActionListener?

@student = Student.where(user_id: current_user.id).first
@student ||= Student.new(user_id: current_user.id)
@student.department_id = 1
@student.save

Это лучше, если у вас есть связь между пользователем и студентом. Что-то вроде

@student = current_user.student || current_user.build_student
@student.department_id = 1
@student.save

РЕДАКТИРОВАТЬ:

Вы также можете использовать http://guides.rubyonrails.org/active_record_querying.html#first_or_create в ответ на это sevenseacat, но вам все еще приходится иметь дело с различными сценариями, такими как обновление идентификатора студенческого отделения.

ОБНОВЛЕНИЕ:

Вы можете использовать find_or_create_by

@student = Student.find_or_create_by(user_id: current_user.id) do |student|
  student.department_id = 1
end
5
задан alain.janinm 1 May 2012 в 10:04
поделиться

5 ответов

Я обычно говорю примерно так:

JPanel panel = new JPanel();
panel.add(new JButton(new AbstractAction("name of button") {
    public void actionPerformed(ActionEvent e) {
        //do stuff here
    }
}));

AbstractAction реализует ActionListener, поэтому это должно удовлетворить задачу.

Сжать так много строк кода вместе может быть плохой практикой, но если вы Если вы привыкли читать его, он может быть довольно элегантным.

13
ответ дан 18 December 2019 в 07:31
поделиться

Как правило, реализация нескольких типов - плохая идея.

Расширять классы JComponent редко требуется, хотя это делается во многих плохих программах и учебных пособиях. . Идиома / хак, получившая распространение в последнее время, - это двойная скобка - класс является только подклассом для того, чтобы дать ему инициализатор экземпляра, который действует как с оператором из других языков.

В этом случае, соответствующий код можно записать как:

JButton button = new JButton();
button.addActionListener(new ActionListener() {
    int counter = 1;
    {
        updateText();
    }
    public void actionPerformed(ActionEvent arg0) {
        --counter;
        updateText();
    }
    private void updateText()
        setText(Integer.toString(counter));
    }
});
f.getContentPane(button);

Если он станет более сложным, вы, вероятно, захотите создать внешний класс (который не реализует ActionListener или расширяет JButton ). для обработки данных.

Также обратите внимание, что вы должны использовать шаблон EventQueue.invokeLater , чтобы гарантировать, что компоненты Swing когда-либо используются только в AWT EDT.

2
ответ дан 18 December 2019 в 07:31
поделиться

Это довольно уродливо, но вы могли бы сделать следующее, используя метод ActionListener и анонимный класс:

  f.getContentPane().add(new JButton(new AbstractAction("name of button") {
      private int counter = 0;

      public void actionPerformed(ActionEvent e) {
          ((JButton) e.getSource()).setText(Integer.toString(counter--));
      }
  }) {
      {
          setText("1");
      }
  });

Чтобы упростить доступ к счетчику, вы можете переместить его на верхний уровень вашего класса и получить к нему доступ из обоих мест, где вызывается setText.

4
ответ дан 18 December 2019 в 07:31
поделиться

Я бы не стал делать что-то подобное в реальной программе, но, учитывая требования вашего задания, вы вряд ли сможете сделать лучше.

1
ответ дан 18 December 2019 в 07:31
поделиться

Что ж, есть гораздо более элегантный способ сделать это.

К сожалению, это не подход Core Java / Swing.

Вы можете использовать SwingBuilder в Groovy для достижения того же результата. , используя немного более сжатый синтаксис, например псевдокод:

button(text: '' + counter,
         actionPerformed: {counter--; text = '' + counter + ''},
         constraints:BL.SOUTH)

[ http://groovy.codehaus.org/Swing+Builder] [1]

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

Я думаю, что то, что у вас есть сейчас, совершенно нормально.

1
ответ дан 18 December 2019 в 07:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: