2013-04-12 2 views
0

У меня есть основной класс с внутренними классами. Это приложение swing/GUI.лучший способ реализовать внутренний класс с помощью слушателей

У меня есть внутренние классы, которые свинг связан такие как расширение JPanel, JDialog и т.д ...

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

Например основной класс имеет внутренний класс, так и внутри внутреннего класса у меня есть анонимный класс слушателя, такие, как это:

public class Main extends JApplet { 
//etc... 
    private class CTable extends JPanel { 
     CDialog td; 
     private JPopupMenu menu; 
     public CTable(String title, AbstractTableModel tableModel) { 
     //etc... 
     menu = new JPopupMenu(); 
     JMenuItem menuItem = new JMenuItem("Test"); 
     menu.add(menuItem); 
     //etc... 
     menuItem.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent event) { 
       CTable.this.td = new CDialog("Test"); 
       CTable.this.td.setVisible(true); 
      } 
     }); 
    } 

} 

Мой единственный вопрос связан только ли это хорошая практика, чтобы получить доступ к переменной, как это: CTable.this.td = новый CDialog («Тест»); CTable.this.td.setVisible (true); ... из анонимных классов и предложений по различным стратегиям реализации/шаблонам проектирования.

+3

Лично я не хотел бы так поступать. Моя главная проблема заключается в том, что произойдет, если кто-то расширяет ваш класс и хочет изменить способ работы диалога? Технически, там застряли. Геттер из основного класса предоставит разработчику возможность изменить это поведение, не прибегая к тому, чтобы попытаться выяснить, как изменить свой внутренний класс ... и да, мне пришлось копировать разметки кода для просто эта проблема - MHO – MadProgrammer

+0

хорошо пункт относительно модульность. – 2013-04-12 00:26:19

ответ

1

Я знаю, что анонимные внутренние классы - это идиома Свинг с навсегда, но мне они никогда не нравились.

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

+0

+1 миллион для немого вида. – splungebob

+0

Спасибо, splungebob. – duffymo

+0

спасибо, ну, я согласен с ответом на MVC, но другие предложения были отличными. слишком плохой stackoverflow не позволяет принимать более одного ответа – 2013-04-12 00:35:54

0
CTable.this.td.setVisible(true); 

Существует правило называется Law of demeter. Это означает, что вы должны напрямую обращаться к классам. Перейдя по нескольким объектам, чтобы получить желаемый метод, вы создаете tight coupling между вашими классами, что затрудняет изменение отдельных классов в будущем.

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

+0

спасибо за предложение шаблона дизайна. – 2013-04-12 00:28:00