[Action/MenuListener] Problem z zagubioną akcją...

0

W skrócie:
Dlaczego akcje wywołane na obiekcie przed jego ukryciem nie są wykonywane? Czy da się to jakoś obejść?
Czy da się sprawić, by MenuDeselected było wykonywane po ActionPerformed?

W tym roku przerabiamy na uczelni jave i co tydzień musimy umieszczać w programie określone rzeczy, teraz przypadło na m. in. MenuBara i ToolBara. Żeby nie robić tego wszystkiego na siłę, wymyśliłem sobie, że zrobię takiego swojego ribbona i nawet mi to nieźle wyszło, ale...

Najpierw opiszę jak to u mnie działa:

  • Menubar nie ma żadnych MenuItemów, tylko same napisy na nim. Nasłuchiwane MenuListenerem.
  • W MenuSelected odpowiedni ToolBar jest dodawany na panel i wyświetlany.
  • W MenuDeselected stary ToolBar jest usuwany z panelu (mam też wersję z setVisible(false)).
  • Elementy ToolBara nasłuchiwane są ActionListenerem.

Niestety akcje naciśniętych na ToolBarach przycisków nie są rejestrowane, ponieważ MenuDeselected wywołuje się przed ActionPerformed, ToolBary są usuwane, a java w tym momencie olewa te akcje (??). Podobnie się rzecz ma, kiedy ToolBary tylko ukrywam setVisible(false), wtedy również akcje nie są wywoływane (??).

Już mnie to do szału doprowadza, bo nie widzę żadnego wyjścia z tej sytuacji! [???] Może ktoś z Was będzie mógł mi poradzić?

0

Obszedłem to w bardzo nieładny sposób, mianowicie dodałem MouseListenera na wszystko na formie oprócz przycisków na ToolBarach, a w MenuDeselected tylko ustawiam sobie flagę, na podstawie której usuwam menu w MouseClick lub ActionPerformed ;)

0

Fajnie, że to rozwiązałeś, ale rzucasz nazwami klasy a kodu już nie raczysz podać, ktoś ma się domyślać? Temat to nie pamiętnik, żeby pisać w nim sam do siebie.

0

Ok, specjalnie dla Ciebie ;) Aczkolwiek uważam, że opisałem problem wyczerpująco, no i podawanie tutaj dodatkowo kodu jest raczej zbędne.

Aplikacja w stanie początkowym:
user image
Aplikacja po kliknięciu w menu "Gra":
user image

Jeśli widoczna pinezka nie jest zaznaczona (nie jest zawsze na wierzchu), to po kliknięciu menu się chowa. Poniżej kod w skrócie (tak wyglądał przed poprawkami):

static JPanel toolBars; // 2 toolbary nałożone na siebie
Boolean alwaysOnTop = false; // czy ribbon jest zawsze na wierzchu
 
public void menuDeselected(MenuEvent e) {
	if (!alwaysOnTop)
		toolBars.setVisible(false);
}
 
public void menuSelected(MenuEvent e) {
	JMenu menu = (JMenu) e.getSource();
	if (menu.getText().equals("Gra"))
		((CardLayout) toolBars.getLayout()).show(toolBars, "tbGame");
	else if (menu.getText().equals("Pomoc"))
		((CardLayout) toolBars.getLayout()).show(toolBars, "tbHelp");
	toolBars.setVisible(true);
}
 
	public void actionPerformed(ActionEvent e) {
		// podjęcie akcji w zależności od wygenerowanego zdarzenia
		String action = e.getActionCommand();
		if (action.equals("bNewGame_Click")) {
			// kod dla NEWGAME
		} else if (action.equals("bHighscores_Click")) {
			// kod dla HIGHSCORES
		} else if (action.equals("bExit_Click")) {
			// kod dla EXIT
			}
		}
		frame.validate();
	}

Wyciąłem kod z akcji i wstawiłem komentarze - łatwiej będzie to przeglądać, a ten kod nie wnosił nic do tematu.

Zasada jak opisałem na początku tematu:

  1. Klikamy menu "Gra".
  2. Wywołuje się MenuSelected i wyświetla się ToolBar.
  3. Klikamy jeden z przycisków.
  4. Wywołuje się MenuDeselected i chowa się ToolBar.
  5. Akcja kliknięcia przycisku "ginie w akcji" ;)
0

Imho, nie opisałeś problemu wystarczająco i dlatego nikt nie próbował Ci pomóc.

0

Dodam jeszcze, że nigdy nie nazwał bym w taki sposób tych metod.
Według mnie nazwa metody powinna mówić co metoda robi, szczerze dla mnie te nazwy (menuSelected) były listenerami i to nie poprawnie nazwanymi. Lepsze było by zastosowanie:
showToolbars(), hideToolbars() itp.

Kiedyś ten artykuł mi pomógł:

http://java.sun.com/docs/codeconv/html/CodeConventions.doc.html

0

Eee... Przecież to są metody z interfejsu listenerów ;) Chyba ciężko się tego nie domyślić! Są dokładnie takie same, jako parametr mają eventy ;) Ale mimo wszystko, dzięki za chęć pomocy :) A tak btw, ten artykuł jest u nas wymagany do zapoznania się, a używanie konwencji jest oceniane :P

Ok, następnym razem opiszę problem lepiej.

Pozdrawiam :)

0

a no racja, to ja przyspałem:), ale tak jest jak się Javy dawno nie widziało.

U nas to znaczy, na Twojej uczelni? czy miejscu pracy? Jestem ciekawy bo to bardzo dobrze o takiej szkole.

0

Uczelnia - Politechnika Śląska. Wymagania są spoko, chociaż patrząc na to, że to mój dodatkowy przedmiot za 0 pkt ECTS, to trochę dziwne, że poświęcam na niego najwięcej czasu ze wszystkich xD A na uczelni nie jest tak różowo, za dużo przedmiotów, które z życiem i pracą zawodową niewiele wspólnego mają...

0
rzepcio napisał(a)

A na uczelni nie jest tak różowo, za dużo przedmiotów, które z życiem i pracą zawodową niewiele wspólnego mają...

Skąd ja to znam, uroki naszej edukacji niestety. Ale od Javy musisz mieć kumatego wykładowcę.

Pozdrawiam

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