Visualizzazione dei risultati da 1 a 3 su 3

Discussione: soluzione keyListener

  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2016
    Messaggi
    21

    soluzione keyListener

    Buona sera
    ho scritto questo keyListener
    codice:
    class KeiListener implements KeyListener {
    
    
        public void keyPressed(KeyEvent a) {
            int ch = a.getKeyCode();
            
            if (ch==525){
                FrameRiepilogo.AggiornaRiepilogo(strutturaSportiva);
                FrameRiepilogo.V();
                System.out.println("pressed menu");
                
            }
            
        }
    
    
        public void keyReleased(KeyEvent a) {}
        public void keyTyped(KeyEvent a) {}
        
    }
    è quando viene cliccato il tasto selezionato si dovrebbe aprire questo frame
    codice:
    public class FrameRiepilogo extends JFrame{
        private static StrutturaSportiva strutturaSportiva;
        private static JTextArea ta = new JTextArea();
        private static JScrollPane a = new JScrollPane(ta);
        private static JFrame frame = new JFrame("Riepilogo");
        
    
    
        //private static boolean visible = true;
        
        public static void V(){
            frame.setVisible(true);
        }
        
        public static void AddFrame(StrutturaSportiva s){
            strutturaSportiva = s;    
            frame.setSize(750, 500);    
            frame.setVisible(true);
            frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        }
        
        
        
        public static void AggiornaRiepilogo(StrutturaSportiva s){
            
             strutturaSportiva = s;            
            frame.setSize(550, 700);        
            frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
            frame.setLocation(816, 0);
                
            ta.setEditable(false);
            ta.append("STADI \n");
            for(int i = 0; i<strutturaSportiva.sizeStadi();i++){
                ta.append(strutturaSportiva.getStadio(i).toStringCompleto()+"\n");
            }
            
            ta.append("\n CALENDARIO \n");
            for(int j = 0; j<strutturaSportiva.sizePartite();j++){
                ta.append(strutturaSportiva.getPartita(j).toStringCompleto()+"\n");
            }
            
            ta.append("\n Clienti \n");
            
            for(int j = 0; j<strutturaSportiva.sizeClienti();j++){
                ta.append(strutturaSportiva.getCliente(j).toString()+"\n");
            }
            
            ta.append("\n Stadi Scontati \n");
            
            if(strutturaSportiva.sizeStadiScontati()==0)
                ta.append(ScontoStadio.toStringS()+"\n");
            
            for(int j = 0; j<strutturaSportiva.sizeStadiScontati();j++){
                ta.append(strutturaSportiva.getStadioScontato(j).toString()+"\n");
            }
            
            ta.append("\n Partite Scontate \n");
            
            
            if(strutturaSportiva.sizePartiteScontati()==0)
                ta.append(ScontoPartita.toStringS()+"\n");
                
            for(int j = 0; j<strutturaSportiva.sizePartiteScontati();j++){
                ta.append(strutturaSportiva.getPartitaScontato(j).toString()+"\n");
            }
            
            ta.append("\n Fascia Giornaliera Scontata \n");
            ta.append(ScontoFasciaGiornaliera.ToString()+"\n");
            
             frame.add(a);
            // frame.setVisible(true);
            
        }
    
    
    }
    il keyListener viene agganciato ad un frame principale che contiene delle Jtextfiel e un botton di conferma.
    Dopo aver premuto questo bottone di conferma ,
    premendo il tasto '525' vorrei riaprire il FrameRiepilogo ma siccome il focus (credo cosi si dica) si e spostato sul bottone (o quando in modo generico si sposta su una componente) il keyListener non funziona più...come potrei fare in modo che in qualsiasi momento io devo riuscire a far partire il keyListener ?
    potreste suggerirmi qualche soluzione (che non comprenda l aggiunta di una qualsiasi componente al frame ne menu ne bottoni ne niente)

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Innanzitutto mettere 525 schiantato nel codice non è per niente bello né esplicativo. Son dovuto andare nella documentazione javadoc nella sezione che elenca i valori delle costanti per capire cosa è! Ed è il valore di KeyEvent.VK_CONTEXT_MENU. Quindi questo dovresti usare ... non il valore.

    A parte questo, se l'obiettivo è gestire un tasto indipendentemente dal componente che ha il "focus" nella finestra, allora KeyListener non è sufficiente e non va bene. Dovresti usare la API del Key Binding. C'è il tutorial ufficiale: How to Use Key Bindings

    E un esempio basilare è:

    codice:
    InputMap frameInputMap = frame.getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
    ActionMap frameActionMap = frame.getRootPane().getActionMap();
    
    frameInputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_CONTEXT_MENU, 0), "azioneContext");
    
    frameActionMap.put("azioneContext", new AbstractAction() {
        public void actionPerformed(ActionEvent e) {
            // ..... fai quello che vuoi
        }
    });

    Dove frame è riferito al tuo JFrame (può essere il this implicito se una classe estende JFrame) e "azioneContext" è una qualunque stringa che ti pare, purché abbastanza specifica e distintiva, serve solo per legare la entry nel InputMap alla entry nel ActionMap.


    Infine, e sperando di non infastidirti/offenderti (ci mancherebbe ..) vorrei solo farti notare che le tue classi, dal punto di vista del "design" sono praticamente un po' un disastro. Metodi statici, campi statici, invocazioni di metodi statici tra classi (almeno da quanto si vede tra la classe del listener e FrameRiepilogo).
    Ultima modifica di andbin; 23-02-2016 a 11:29
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Jan 2016
    Messaggi
    21
    ciao grazie mille per l aiuto funziona perfettamente...
    Comunque quella classe FrameRiepilogo mi serve solo a me per vedere se il progetto fa tutto quello che dovrebbe fare e siccome non ho bisogno di creare oggetti ,me ne serve solo uno di quello ,avevo pensato di farlo statico e se i metodi sono statici le variabili devo essere statiche.
    Cosa mi consigli di fare quando non mi serve creare tanti oggetti di una classe ma solo uno GRAZIE MILLE DI NUOVO

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.