Menu, zdarzenia oraz kilka klas

0

Dzień dobry

Otóż, piszę program typu Notatnik gdzie na dzień dzisiejszy mam następujące klasy:

  • NotatnikFrame (dziedziczy po JFrame)
  • NotatnikPanel (dziedziczy po JPanel)
  • NotatnikMenuBar (dziedziczy po JMenuBar)
  • NotatnikFileChooser (dziedziczy po JFileChooser)

W konstruktorze NotatnikFrame mam tworzone instancje klas NotatnikPanel oraz NotatnikMenuBar oraz odpowiednio ustawiane jako panel oraz menu. W jednej z opcji menu mam możliwość wyboru pliku poprzez NotatnikFileChooser; wybrany plik następnie będę przetwarzał - wyświetlał w komponencie JTextArea.

Pytanie:
Mój problem polega na tym, że zdarzenie które obsługuje wybór pliku jest w klasie NotatnikMenuBar, zaś zawartość pliku chciałbym móc przetwarzać w panelu (gdzie mam kontrolkę JTextArea) jednak jak zaznaczyłem wyżej instancje klas NotatnikMenuBar i NotatnikPanel są w NotatnikFrame. Chciałbym wiedzieć jak mogę przekazać wynik (nazwę pliku) zdarzenia z NotatnikMenuBar do NotatnikPanel

Tak wygląda obsługa zdarzenia w klasie NotatnikMenuBar

        JMenuItem itemOtworz = new JMenuItem("Otwórz");
        itemOtworz.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                
                NotatnikFileChooser fileChooser = new NotatnikFileChooser();
                fileChooser.setFileHidingEnabled(false);                  
                int returnOption = fileChooser.showOpenDialog(null);
                
                
                if(returnOption == NotatnikFileChooser.APPROVE_OPTION) {
                    System.out.println("" + fileChooser.getSelectedFile().getAbsolutePath());   // tą scieżkę chciałbym przekazać do klasy NotatnikPanel
                }
            }            
        });

Zaś tak wygląda klasa NotatnikFrame

public class NotatnikFrame extends JFrame {
    
    public NotatnikFrame(Dimension windowSize, String windowTitle) {
        
        setSize(windowSize);
        setTitle(windowTitle);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);        
                
        notatnikMenuBar = new NotatnikMenuBar();
        setJMenuBar(notatnikMenuBar);        
        
        notatnikPanel = new NotatnikPanel();
        container = getContentPane();        
        container.add(notatnikPanel);                
        
    }    


    private Container container;
    private NotatnikPanel notatnikPanel;
    private NotatnikMenuBar notatnikMenuBar;
}
0

Klasa NotattnikMenuBar to juz chyba udziwnienie, o ile pamietam zawsze stosowałem standardowe Menu i działało extra, i Tobie jednak też to polecam. Gdybys chciał pozostac przy swoim. to chyba wzorzec mostu zastosować by trzeba.

pzdr.

0

Przekazywanie zdarzeń najlepiej obsłużyć we wzorcu Obserwator:
http://pl.wikipedia.org/wiki/Wzorzec_obserwatora
Co do własnego komponentu JMenuBar to warto go pisać wtedy gdy chcesz np. stworzyć własny niepowtarzalny layout lub dodać jakieś specyficzne funkcjonalności. W innym wypadku się to po prostu nie opłaca.

0

Dziękuje za szybką odpowiedź. Zastosowałem wzorzec obserwatora i wszystko działa jak należy.

Mam jednak pytanie. Jak tak naprawdę organizuje się komunikację między obiektami, gdy mam ich już sporą ilość, a nie są powoływane do życia w tym samym obiekcie ?

Dla przykładu zostańmy przy tym edytorze - jedne obiekty są powoływane w ramce, inne w panelu, a jeszcze inne w osobnych oknach ? Jak wygląda komunikacja między nimi ? Jak są obsługiwane zdarzenia ?

0

Zazwyczaj wzbogaca się wzorzec obserwatora o dodatkowy obiekt dyspozytora. Wszystkie żądania trafiają do tego obiektu potem są odpowiednio kierowane. W praktyce wygląda to w ten sposób że dyspozytor jest jedynym ActionLisinerem przypisanym do okna, który ma w sobie instrukcję switch. Trochę to udziwnione ale w ten sposób jest obsługiwana komunikacja w bibliotece awt.

1 użytkowników online, w tym zalogowanych: 0, gości: 1