Prośba o pomoc w zrozumieniu działania zdarzeń

0

Witam, w temacie javy jest początkujący, do tej pory programowałem w Visual Studio C#, wszystkie zdarzenia obsługujące działanie komponentów można było dodać wizualnie, albo poprzez dodanie delegata, niestety w Javie odbywa się to nieco inaczej. Na pewno nie do końca rozumiem schemat działania zdarzeń, a bez tego nie da się programować.
Pod pytaniami zamieszczam cały kod do którego one się odnoszą.

  1. Czy ActionListener jest podstawowym słuchaczem? Czy za jego pomocą mogę jakoś identyfikować i dzielić zdarzenia np. kliknięcia, czy rozróżniać obiekty który wywołał zdarzenie? Zastanawiam się czy w ogóle zrobienie metody dla całego Frame, a później wyszukiwanie ich przez switch ma sens?

  2. Dla obiektu menuItem wywołane są metody
    // DZIAŁA WYSWIETLA ActionPerformed dla Window

// menuItemImportWMRODZ.addActionListener(this);

// NIE DZIAŁA

// menuItemImportWMRODZ.addMouseListener(this);

Rozumiem, że w nawiasie podawany jest obiekt dla którego wywoływane są metody?

  1. W tym przypadku tworzę osobne zdarzenie które obsługuję dokładnie jeden element menuItem, podobnie jak w C#.
    Dla drugiej opcji trochę bez sensu wydaje się konieczność za każdym razem deklarowania wszystkich metod, jeżeli chcesz wywoła zdarzenie tylko Click.
// Działa
menuItemImportWMRODZ.addActionListener(new ActionListener() {
  public void actionPerformed(ActionEvent e) {				    	  
    JOptionPane.showMessageDialog(null, "ActionPerformed dla menuItemImportWMRODZ");
  }
});
// Nie działa										
menuItemImportWMRODZ.addMouseListener(new MouseListener() {
  public void mouseClicked(MouseEvent e) {
    JOptionPane.showMessageDialog(null, "MouseListener dla menuItemImportWMRODZ"); 						       }
						
  public void mouseReleased(MouseEvent e)
  {}
  public void mousePressed(MouseEvent e)
  {}
  public void mouseEntered(MouseEvent e)
  {}
  public void mouseExited(MouseEvent e)
  {}
});
  1. Ostatnie pytanie, czy wewnątrz głownego okna zadeklarować prywatne obiekty frame? a w zdarzeniu click dla każdego elementu wykonywać new = frame, i setvisable(show)?

  2. Dodałem jeszcze jedno pytanko, dlaczego działa mousePressed, a nie działa mouseClicked? MouseAdapter zawęża jakoś zdarzenia Mouse?
    menuItemImportWMRODZ.addMouseListener(new MouseAdapter() {
    public void mousePressed(MouseEvent e) {
    JOptionPane.showMessageDialog(null, "menuItemImportWMRODZ");
    }

public void mouseClicked(MouseEvent e) {
JOptionPane.showMessageDialog(null, "MouseListener dla menuItemImportWMRODZ !!");
}
});

0

Częściowa odpowiedź.

  1. Źródło zdarzenia jest opisane w argumencie ActionEvent metody actionPerformed(). Możesz je rozpoznać metodą getSource() lub getActionCommand().
    getSource() zwraca różne wartości dla różnych źródeł zdarzenia, getActionCommand() może zwrócić to samo, przydaje się, to gdy chcesz te samą akcje wywołąc na wiele sposobów:
    przycisk, pozycja w menu, menu kontekstowe. Uczeni w piśmie zalecają tworzenie różnych słuchaczy dla różnych komponentów, ja z reguły ignoruje to zalecenie.
  2. Tak, w nawiasie podawany jest obiekt którego metody są wywoływane.
  3. Zamiast interfejsu MouseListener możesz użyć klasy MouseAdapter, które ma wszystkie metody zaimplementowane (są one puste).
  4. Nie rozumiem o co pytasz. Domyślam się, że o otwieranie innych okien. Możesz potworzyć pola prywatne, podczas inicjacji głównego okna utworzyć inne okna (bez setVisible(true)).
    Możesz je tworzyć w obsłudze zdarzenia:
if(okno==null)
{
    okno=new InneOkno();
}
okno.setVisible(true);

Zazwyczaj kiepskie jest tworzenie innego okna za każdym razem po kliknięciu w przycisk. Tracisz wtedy dane wprowadzone przez użytkownika, położenie okna, które wybrał użytkownik,...

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