Visualizzazione dei risultati da 1 a 4 su 4

Discussione: [Java] problema eventi

  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2014
    Messaggi
    17

    [Java] problema eventi

    ciao a tutti, scrivo perchè è da qualche settimana che programmo in java con eclipse e ho qualche problema con la gestione degli eventi. Quando uso un KeyListener o un WindowListener non mi funzionano.
    Posto qui un pezzo di codice:
    package esmpio2;import java.awt.*;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.KeyEvent;
    import java.awt.event.KeyListener;
    import java.awt.event.WindowEvent;
    import java.awt.event.WindowListener;


    public class finestra extends Frame {
    Button esci=new Button("ESCI");
    Button invio=new Button("INVIO");
    Label l1=new Label("0");
    public finestra(){
    setLocation(200,200);
    setSize(200, 300);
    setVisible(true);
    esci.addActionListener(new Ascoltatore());
    esci.setActionCommand("CLICK");
    esci.addKeyListener(new Ascoltaesci());
    invio.addKeyListener(new Ascoltainvio());
    add(esci,BorderLayout.NORTH);
    add(invio,BorderLayout.CENTER);
    add(l1,BorderLayout.SOUTH);
    pack();
    show();
    addWindowListener(new ascoltafinestra());
    }
    public static void main(String[]args)
    {
    new finestra();
    }
    public class Ascoltatore implements ActionListener{
    public void actionPerformed(ActionEvent e)
    {
    if(e.getActionCommand().compareTo("CLICK")==0) System.exit(0);
    }
    }
    public class Ascoltaesci implements KeyListener{

    public void keyTyped(KeyEvent e) {
    }


    public void keyPressed(KeyEvent e) {
    int comando=e.getKeyCode();
    if(comando==27) System.exit(0);
    }



    public void keyReleased(KeyEvent e) {
    }

    }
    public class ascoltafinestra implements WindowListener{



    public void windowOpened(WindowEvent e) {

    }



    public void windowClosing(WindowEvent e) {


    }


    public void windowClosed(WindowEvent e) {


    }


    public void windowIconified(WindowEvent e) {

    }


    public void windowDeiconified(WindowEvent e) {
    }


    public void windowActivated(WindowEvent e) {
    }

    public void windowDeactivated(WindowEvent e) {

    }
    }
    public class Ascoltainvio implements KeyListener{
    public void keyTyped(KeyEvent e) {
    }
    public void keyPressed(KeyEvent e) {
    int comando=e.getKeyCode();
    int valore=0;
    if(comando==10) l1.setText(+(valore++));

    }
    public void keyReleased(KeyEvent e) {
    }

    }
    }

    mi funziona solo l'evento Ascoltaesci, perchè? mi potete dire dove sbaglio.
    Grazie...

  2. #2
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    1. Java ha una sua sezione
    2. Il codice è illeggibile: puoi indentarlo e postarlo col tag CODE? Grazie
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  3. #3
    Utente di HTML.it
    Registrato dal
    Apr 2014
    Messaggi
    17
    forse intendevi così?

    codice:
    package esmpio2;
    import java.awt.*;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.KeyEvent;
    import java.awt.event.KeyListener;
    import java.awt.event.WindowEvent;
    import java.awt.event.WindowListener;
    
    public class finestra extends Frame {
        Button esci=new Button("ESCI");
        Button invio=new Button("INVIO");
        Label l1=new Label("0");
        public finestra(){
      super("MIMMO");
      setLocation(200,200);
      setSize(200, 300);
      setVisible(true);
      esci.addActionListener(new Ascoltatore());
      esci.setActionCommand("CLICK");
      esci.addKeyListener(new Ascoltaesci());
      invio.addKeyListener(new Ascoltainvio());
      add(esci,BorderLayout.NORTH);
      add(invio,BorderLayout.CENTER);
      add(l1,BorderLayout.SOUTH);
      pack();
      show();
      addWindowListener(new ascoltafinestra());
        }
    public static void main(String[]args)
    {
        new finestra();
    }
    public class Ascoltatore implements ActionListener{
        public void actionPerformed(ActionEvent e) 
        {
      if(e.getActionCommand().compareTo("CLICK")==0) System.exit(0);
        }
    }
    public class Ascoltaesci implements KeyListener{
        
        public void keyTyped(KeyEvent e) {
      }
    
        public void keyPressed(KeyEvent e) {
      int comando=e.getKeyCode();
      if(comando==27) System.exit(0);
        }
    
        
        public void keyReleased(KeyEvent e) {
        }
        
    }
    public class ascoltafinestra implements WindowListener{
    
        
        public void windowOpened(WindowEvent e) {
       
        }
    
        
        public void windowClosing(WindowEvent e) {
        
      
        }
    
        public void windowClosed(WindowEvent e) {
        
      
        }
    
        public void windowIconified(WindowEvent e) {
       
        }
    
        public void windowDeiconified(WindowEvent e) {
       }
    
        public void windowActivated(WindowEvent e) {
        }    
      
      public void windowDeactivated(WindowEvent e) {
        
        }
    }
    public class Ascoltainvio implements KeyListener{
        public void keyTyped(KeyEvent e) {
        }
        public void keyPressed(KeyEvent e) {
      int comando=e.getKeyCode();
      int valore=0;
      if(comando==10) l1.setText(+(valore++));
      
        }
        public void keyReleased(KeyEvent e) {
        }
        
    }
    }

  4. #4
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Potevi anche riportare gli errori di compilazione

    Comunque, qualche indicazione sparsa:

    1) Fai sparire i magic number dal codice.

    Non scrivere

    if (comando == 27)

    ma

    if (comando == KeyEvent.VK_ESCAPE)

    2) ascoltafinestra a cosa ti serve? Tutti i metodi sono vuoti...
    In casi così, dove ci sono tanti metodi da implementare e non tutti ti interessano ti consiglio di usare gli appositi
    adapter.

    Ad esempio, Ascoltaesci (pessimo nome tra l'altro) puoi riscriverlo come

    codice:
    public class Ascoltaesci extends KeyAdapter {
       @Override
       public void keyPressed(KeyEvent e) {
           if (e.getKeyCode() == KeyEvent.VK_ESCAPE) {
               System.exit(0);
           }
       }
    }
    I listener raramente hanno bisogno di essere classi a sé stanti: meglio dichiararli inline:

    codice:
    esci.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            System.exit(0);
        }
    });
    Tra l'altro così il controllo sull'action command diventa inutile.

    Ricordati l'annotazione @Override quando ridefinisci un metodo: ti salva da errori subdoli.

    3) show() è deprecato e non va usato, usa setVisibile(true/false).
    setVisibile(true) deve essere l'ultima operazione altrimenti potrebbe non funzionare correttamente.

    4) Stai usando componenti UI di AWT, roba vecchia che non usa più nessuno.
    Il framework grafico di Java è Swing (nella maggior parte dei casi ti basta aggiungere una J davanti al nome: Label -> JLabel, TextField -> JTextField, Frame -> JFrame ecc)

    5) Al posto di KeyListener/KeyAdapter, per rilevare tasti speciali ti consiglio di utilizzare input map/action map
    http://docs.oracle.com/javase/tutori...eybinding.html

    6) Nomenclatura
    Le classi iniziano con la maiscola (ad esempio, AscoltaFinestra)
    Metodi e variabili con la minuscola.

    Nomi sensati alle classi, possibilmente senza "azioni" nel nome.
    Ad esempio, no AscoltaFinestra ma AscoltatoreFinestra (nome che però sparisce se dichiari inline)

    7) l1.setText(+(valore++)); è errata e il compilatore di dice anche perché: vuole una stringa ma gli stai passando un intero.
    l1.setText(String.valueOf(valore++));

    Io rivedrei quel blocco però, attualmente stampa SEMPRE (SEMPRE) zero: è una variabile locale, muore alla fine del metodo.
    Inoltre il ++ viene valutato DOPO aver passato il valore a valueOf e quindi resta zero)
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

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.