Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it L'avatar di caralu
    Registrato dal
    Sep 2004
    Messaggi
    135

    Finestra non riceve il Focus!

    Ciao ragazzi! Ho un nuovo problema..
    Ho creato una GUI costituita da un JFrame, su cui vi sono collocati dei bottoni.
    Alla pressione del bottone start si dovrebbe chiudere il JFrame della GUI e aprire un nuovo Frame (associato a un'altra classe) in una finestra a schermo intero. Tutto questo avviene correttamente. Il problema è che la nuova finestra su cui giace il Frame non risponde al bottone di chiusura (mentre a qullo per ridurre a icona si) e poi l'oggetto Frame di questa classe (che implementa l'interfaccia KeyListener) dovrebbe rispondere a degli eventi da tastiera, ma questo non succede! E' come se non avesse il Focus,mentre invece ce l'ha!
    Invece...Se anzichè aprire la finestra dalla GUI la apro direttamente dalla classe che istanza Frame (ossia Game), questo funziona benissimo e la finestra risponde ai comandi!! Vi posto un po di codice:
    codice:
    /* Questo è nella classe GUI: alla pressione del tasto star viene nascosto il frame della classe GUI e viene istanziato un nuovo oggetto della classe Game*/
    if( src.equals(start) )
                    {
                    frameOwner.setVisible(false);         
                    Game inizio = new Game();                
                    }
    
    /*Il costruttore della classe Game inizializza il Frame associato alla 
    finestra in questo modo:*/
    frame = new Frame("Frame capriccioso!"); //frame è dichiarato globale
    frame.setLayout(null);
    setBounds(0,0,1024,768);
    frame.add(this);
    frame.setSize(1024,768);
    frame.setResizable(false);
    //frame.setFocusableWindowState(true); //ho provato anche questo..
    frame.setVisible(true);
    
    frame.addWindowListener(new WindowAdapter() {
                public void windowClosing(WindowEvent e) {
                    System.exit(0);
                }
            });
            
    frame.addKeyListener(this);
    addKeyListener(this);
    Chi mi sa dare una mano d'aiuto??
    Linux Slackware 11 - Kernel 2.6.18

  2. #2
    Utente di HTML.it L'avatar di caralu
    Registrato dal
    Sep 2004
    Messaggi
    135
    Dai ragazzi, mi serve urgente urgente!!!!
    Linux Slackware 11 - Kernel 2.6.18

  3. #3
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    non c'è niente di urgente... comunque, hai provato con requestFocus?
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  4. #4
    Utente di HTML.it L'avatar di caralu
    Registrato dal
    Sep 2004
    Messaggi
    135
    Originariamente inviato da Andrea1979
    hai provato con requestFocus?
    Ho provato anche a mettere
    codice:
    frame.requestFocus()
    nel costruttore di Game, ma niente da fare..Ho provato questo esperimento:
    codice:
    if(frame.hasFocus())
                System.out.println("Si focus");
            else
                System.out.println("NO focus");
    Se avvio la finestra dalla classe GUI la finestra Game non ha il focus, mentre se avvio Game direttamente invece ho il focus...
    Linux Slackware 11 - Kernel 2.6.18

  5. #5
    Utente di HTML.it L'avatar di caralu
    Registrato dal
    Sep 2004
    Messaggi
    135
    Finalmente ho risolto!!!!
    Dato che dall'interfaccia stavo eseguendo un videogame (e quindi una while su Game che termina solo quando il gioco è finito), quando creavo una nuova istanza di Game per poter lanciare il gioco
    codice:
    Game inizio = new Game();
    questo, non restituiva nulla all'interfaccia prima di aver concluso il gameLoop()! Quindi l'interfaccia non cedeva il focus (dato che stava ancora eseguendo qualcosa) e il controllo del focus mi veniva restituito ovviamente quando il gioco terminava (a questo punto non mi serviva più!!)..Quindi la soluzione è stata:
    fare estendere alla classe (interna a GUI) gestore del KeyListener anche l'interfaccia Runnable e fare implementare il metodo run() affinchè lanciasse il gameLoop() tramite un nuovo thread, in modo tale da eseguire separatamente (tramite il thraed appunto) il gioco restituendo subito il focus all'interfaccia!
    Linux Slackware 11 - Kernel 2.6.18

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.