Focus u komponent a odchytávání udalostí – Java – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Focus u komponent a odchytávání udalostí – Java – Fórum – Programujte.comFocus u komponent a odchytávání udalostí – Java – Fórum – Programujte.com

 

Petr
~ Anonymní uživatel
746 příspěvků
10. 1. 2013   #1
-
0
-

Zdravím,

vytvářím jednoduchou hru. Mám okno aplikace ve kterém mám herní scénu reprezentovanou JPanelem do kterého vykresluji grafiku a na kterém odchytávám události (imlementuje KeyListener a MouseListener). V tomto případě vše funguje bez problému.. Problém nastane jakmile chci do hry vložit jednoduche menu se 4mi položkami.. menu mám řešené pomocí Boxu a v něm příslušné JButtony a do nich vložené mouseListenery v nichž spouštím hru ( něco jako game.start() ).

V tomto případě po stisku příslušného tlačítka se spustí hra. Hra normálně běží ale JPanel scény mi neodchytí žádnou událost.. takže hru nemůžu ovládat.

Nevíte někdo prosím čím by to mohlo být popř. jak to opravit aby Listenery na JPanelu fungovaly normálně?

Zkoušel jsem na JPanel scény volat requestFocus(), requestFocusInWindow() ale nic.. scena ma nastaveno setFocusable(true).

Děkuji

Nahlásit jako SPAM
IP: 212.4.142.–
ingiraxo+15
Grafoman
10. 1. 2013   #2
-
0
-

správně by si měl tlačítka a všechny komponenty kreslit ručně přímo na scenu.. ty máš problém, že používáš několik komponent a ony se mezi sebou přepínaj

takže řešení bych viděl tak, aby si všechno odchytával ý hlavního framu a ten komunikoval přímo se scenou i ostatníma komponentama

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
Petr
~ Anonymní uživatel
746 příspěvků
10. 1. 2013   #3
-
0
-

#2 ingiraxo
No tlačítka mám v Boxu a ten přídávám pomocí scena.add(menu); menu.setVisible(true); a menu zavírám menu.setVisible(false); scena.remove(menu).

Takže to je teda špatně jo? Zkusím to teda odchytávat na framu. Btw. jak se prosím vykreslují tlačítka ručně?

S GUI komponentama dělám poprvé ..

Nahlásit jako SPAM
IP: 212.4.142.–
ingiraxo+15
Grafoman
10. 1. 2013   #4
-
0
-

ty ho sice přidáš, ale veskeré události odchytává scéna, což by bylo v pořádku pokud by si tam měl pouze jednu komponentu se scenou, ale při kliknutí na tlačítko se přenastaví focus a všechny události ze sceny se budou ignorovat

takže jak jsem psal, všechny události odchytávej na hlavním Framu a ty potom přeposílej na scenu

vykreslování tlačítek? prostě si vytvoříš vlastní "komponentu", ale místo přidání do kontejneru se jen vykreslí na scenu (tím že jí budeš vykreslovat, tak při kliknutí neztratíš focus)

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
Petr
~ Anonymní uživatel
746 příspěvků
10. 1. 2013   #5
-
0
-

#2 ingiraxo
Tak události odchytávám na framu.. ale porad to same .. bez menu to funguje ale po přidani menu ne.

Zkusil jsem si vypsat vlastníka focusu po zmáčknutí tlačítka a vypíše se JFrame ale ani nejde zavřít klasicky křížkem.

Nemůže být chyba v tom že celá hra se vlastně odehrává v metodě mousePressed mouseListeneru tlačítka v menu? Hru řeším nekonečnym cyklem kde volam Thread.sleep(30); ..

@Override
            public void mousePressed(MouseEvent e) {
               
                Game.startSinglePlayer();
               
            }


Nahlásit jako SPAM
IP: 212.4.142.–
ingiraxo+15
Grafoman
10. 1. 2013   #6
-
0
-

já nějak nerozumim proč voláš hru v mousePressed, však na to tam máš tlačítko pro start hry ne?

a běží ti ta hra v separátním vlákně když tam máš nekonečnou smyčku?

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
Petr
~ Anonymní uživatel
746 příspěvků
10. 1. 2013   #7
-
0
-

Ta metoda je je v listeneru daneho tlacitka na spousteni hry ;-) ..

No neběží v separé vlákně.. to mě nenapadlo :-) upravil jsem to viz níže a už to běží..

            @Override
            public void mousePressed(MouseEvent e) {
                Thread t = new Thread(new Runnable(){

                    @Override
                    public void run() {
                       Game.startSinglePlayer();
                    }
                });
                t.start();
                
                
            }

Moc děkuji za rady .. že mě to nenapadlo rovnou, taková blbost :-)


Nahlásit jako SPAM
IP: 212.4.142.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 2 hosté

Podobná vlákna

Focus — založil Anonymní uživatel

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý