2011-01-05 3 views

ответ

3

Пара очков:

  • Расширение JFrame, вероятно, неправильный подход
  • Реализация ActionListener на качестве JFrame, вероятно, приведет к не-ООП кода.

Неправильный подход?

Если идея заключается в том, что приложение GUI выполняется, то одно не делает расширение JFrame, но фактически записывает приложение.

Следовательно, JFrame будет частью приложения, а не самого приложения. Следовательно, JFrame должен быть объектом класса.

Реализация ActionListener на качестве JFrame, вероятно, приведет к не-ООП код

Рассмотрим следующий случай - в качестве приложения с графическим интерфейсом начинает получать большие, и мы начинаем добавлять множество кнопок и меню, которые дают начало ActionEvent с.

Если бы JFrame сам должен был получить события, тогда как выглядел бы метод actionPerformed?

Вероятно, что-то вроде этого:

public void actionPerformed(ActionEvent e) { 
    Object source = e.getSource(); 

    // Find out which component fired the event 
    if (source == masterButton) { 
    // ... do something 
    } else if (source == anotherButton) { 
    // ... do something else 
    } else if (...) 
    // ... and so on ... 
    } else if (...) 
    // ... and so on ... 
    } 
} 

Хлоп.

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


Если, например, приложение GUI были экземпляры ActionLister с которой ответили на каждый компонент, то мы сможем разбить действия и связь метода actionPerformed со всеми компонентами в GUI.

Например:

JButton masterButton = new JButton(); 
masterButton.addActionListener(new MasterButtonActionListener()); 

JButton anotherButton = new JButton(); 
anotherButton.addActionListener(new AnotherButtonActionListener()); 

Таким образом, будет ActionListeners для каждой кнопки, которые предположительно имеют различные функциональные возможности. Ответ MasterButtonActionListener должен обрабатывать события от masterButton - он не должен знать о других кнопках в приложении.

Кроме того, это будет способствовать повторному использованию компонентов в других приложениях или другой части приложения без необходимости копировать и = вставлять части монолитного оператора if-else в метод actionPerformed.

+0

Если бы я мог увеличить это миллион раз. – Tansir1

+0

Coolbird Спасибо, что нашли время опубликовать такое подробное объяснение. – JHarley1

+0

@ Tansir1: Thanks :) – coobird

1

Если вы читаете Effective Java, пункт 16 гласит:

"Фавор композиции над Наследование"

. Прочитайте объяснение, данное here

+0

Привет, Амир, не могли бы вы сказать, что это более простой способ? Я очень ржавый с синтаксисом JAVA, поэтому один наследуется от другого, но это плохая идея, потому что это «обычный конкретный класс». – JHarley1

+0

Привет JHarley - то, что он говорит о том, что не наследует от обычного конкретного класса из другого пакета, просто состоит в том, что изменения в этом классе будут напрямую влиять на ваши. Если вы сохранили ссылку на JFrame, вы можете инкапсулировать ее поведение - с подкассой вы не можете. –

0

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

0

Кроме того, A JFrame обычно не получает действий. Его дочерние объекты будут благотворителями ActionEvent.

0

Лучше и более OO-подход состоит в том, чтобы иметь отдельные объекты Action. Это позволяет отделить функциональность и состояние от компонента. Это делает ваш код повторно используемым, потому что вы можете использовать одно и то же действие как на кнопке, так и в элементе меню, например.

Пример:

class ExitAction extends AbstractAction{  
    public ExitAction(){ 
     super("Exit"); 
    } 
    @Override 
    public void actionPerformed(ActionEvent e) { 
     System.out.println("Exiting"); 
    } 
} 

JButton exitButton = new JButton(new ExitAction()); 

Посмотрите на How to Use Actions в Java Tutorial:

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