2010-05-24 3 views
1

Я изучаю Swing и создал интерфейс, используя серию методов get для добавления компонентов. Является ли хорошей практикой добавлять слушателя внутри метода get следующим образом? Я хотел бы сделать все как можно более развязанным.Добавить слушателя внутри или снаружи метода 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

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

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

+1

Кроме того, я бы предложил определить компоненты как частный финал и создать их непосредственно в декларации. – jfpoilpret

+0

Только если они должны быть доступны из других частей рамки/диалога. Ярлыки, например, не требуют даже локальной переменной большую часть времени. Кнопки, которые не будут включены/отключены условно, также не должны быть полями. Существует не общий рецепт, который я думаю - все зависит от ситуации. Но, конечно, нужно стремиться минимизировать количество полей. –

+0

Я ценю отзывы, которые связаны с опытом. Скажите, как вы организовываете компоненты в целом? У вас есть один большой монолитный класс, где описаны все компоненты или вы делаете их в отдельные классы панелей? Я также хорошо слышал о МиГе и попробую. –

1

Похоже, вы реализуете некоторые ленивая инициализация 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.

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

+0

Спасибо. Я не знал, что ленивый подход к инициализации может быть использован, когда дело доходит до Swing. Именно так Visual Editor кодирует компоненты. Я буду хранить копию вашего ответа, если это необходимо. –

Смежные вопросы