2008-11-26 1 views
2

У меня есть JFrame, который содержит «дисплей» JPanel с JTextField и «управление» JPanel с кнопками, которые должны получить доступ к содержимому дисплея JPanel. Я думаю, что моя проблема связана с тем, как использовать шаблон наблюдателя, который в принципе я понимаю. Вам нужно разместить слушателей и обновить сообщения, но я не знаю, где их разместить, как получить доступ с одной панели на другую и, возможно, при необходимости ввести класс «datamodel». Например, я хочу, чтобы получить доступ к содержимому в JTextField с панели управления, и я использую анонимный слушатель действия следующим образом:Как получить доступ к нескольким JPanels внутри JFrame?

JButton openfile = new JButton("Convert file"); 
openfile.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent e) { 
     openButtonPressed(); 
    }   
}); 

ответ

1

Вы должны уменьшить связь между этими объектами.

Вы можете иметь главный объект, которому принадлежит все текстовые поля и кнопки (панели не имеют значения)

Тогда раздельный ActionListener внутри этого главного объекта (я называю это посредник см медиаторов рисунок)

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

Таким образом, вы уменьшаете связь между панелями, текстовыми полями и т. Д., И пусть управление в одном месте (посреднике), то есть вы не даете им знать друг друга.

Вы можете посмотреть на код в этом вопросе: https://stackoverflow.com/questions/324554/#324559

Это показывает эти концепции в выполнении кода.

BTW шаблон наблюдателя уже реализован в JTextField, JButton, ActionListener и т. Д. Вам просто нужно добавить крючки.

Надеюсь, это поможет.

EDIT Включил два ответа в один.

Это код.

class App { // this is the mediator 

    // GUI components. 
    private JFrame frame; 
    private JTextField name; 
    private JTextField count; 
    private JTextField date; 
    // Result is displayed here. 
    private JTextArea textArea; 

    // Fired by this button. 
    private JButton go; 

    private ActionListener actionListener; 


    public App(){ 
     actionListener = new ActionListener(){ 
      public void actionPerformed(ActionEvent e){ 
       okButtonPressed(); 
      } 
     }; 
    } 

    private void okButtonPressed(){ 
     // template is an object irrelevant to this code. 
     template.setData(getData()); 
     textArea.setText(template.getTransformedData()); 
    } 


    public void initialize(){ 

     frame  = new JFrame("Code challenge v0.1"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     name  = new JTextField(); 
     count = new JTextField(); 
     date  = new JTextField(); 
     textArea = new JTextArea(); 
     go  = new JButton("Go"); 
     go.addActionListener(actionListener); // prepare the button. 

     layoutComponents(); // a lot of panels are created here. Irrelevant. 
    } 
} 

Полные и работает код может быть получен here:

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

1

Это делает уборщика кода, если вы создаете модели в один слой и добавьте слоя или два, чтобы создать компоненты и компоновку. Конечно, не распространяйте подобные JFrame и JPanel.

Не чувствуйте необходимости, чтобы иерархия композиции в слое модели точно соответствовала дисплею. Тогда дело только в том, чтобы взять текст из Document и выполнить соответствующую операцию.

Хорошо, перхпа не так просто. Модели Swing немного беспорядочны. В частности ButtonModel поврежден мозгом, а область контроллера не может быть полностью чистой.

0

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

Наконец, строитель вернет родительскую панель с полной логикой.

Как только у вас есть родительская панель, это действительно беспорядок, попадающий в дочерние компоненты, и заставить их что-либо делать.

0

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

Я также нашел эту ссылку на радиослушателей на JTextField Полезное:

link text

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