Добавить слушателя внутри или снаружи метода get - PullRequest
1 голос
/ 24 мая 2010

Я изучаю Swing и создал интерфейс, используя серию методов get для добавления компонентов. Является ли хорошей практикой добавление Listener в метод get следующим образом? Я бы хотел сделать вещи максимально отделенными.

 private JButton getConnectButton() {
  if (connectButton == null) {
   connectButton = new JButton();
   connectButton.setText("Connect");
   connectButton.setSize(new Dimension(81, 16));
   connectButton.setLocation(new Point(410, 5));

   connectButton.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
     // actionPerformed code goes here
    }
   });

  }
  return connectButton;
 }

Ответы [ 2 ]

2 голосов
/ 24 мая 2010

Из моей обширной практики разработчика на Swing я могу вам сказать, что не рекомендуется получать экземпляры компонентов таким способом (через геттеры). Обычно я настраиваю пользовательский интерфейс для Frame / Dialog в некотором методе, например initComponents (), и затем добавляю всех слушателей в некоторый метод, например addListeners (). Я не уверен, что существует единственная лучшая практика, как делать вещи - там много вариантов и личных предпочтений. Как правило, однако, ленивый запуск компонентов, которые вам в любом случае понадобятся (например, эта кнопка, я полагаю), не требуется.

Кроме того - вам действительно следует рассмотреть возможность использования какого-либо менеджера компоновки, например MiG , и избегать жестко закодированных размеров компонентов.

1 голос
/ 24 мая 2010

Кажется, вы реализуете ленивую инициализацию connectButton. Это, вероятно, хорошо, хотя, я бы сделал это так:

private void createButton() {
    connectButton = new JButton(new AbstractAction("Connect") {
        public void actionPerformed(ActionEvent e) {
            // actionPerformed code goes here
        }
    });
    connectButton.setText("Connect");

    // Rely on some LayoutManager!
    //connectButton.setSize(new Dimension(81, 16));
    //connectButton.setLocation(new Point(410, 5));
}

private synchronized JButton getConnectButton() {
    if (connectButton == null)
        createButton();

    return connectButton;
}

Обратите внимание на использование synchronized. Это гарантирует, что не произойдет следующий сценарий:

  • Поток 1 вызывает getConnectButton () и видит connectButton == null
  • Поток 2 вызывает getConnectButton () и видит connectButton == null
  • Тема 1 вызывает createButton
  • Поток 2 вызывает createButton.

Возможно, есть более приятные способы синхронизации конструкции кнопок, но это один из способов.

...