Visualizzazione dei risultati da 1 a 2 su 2
  1. #1

    [JAVA] Velocit� delle animazioni dei JPanel.

    Il mio problema riguarda la velocit� con cui il mio JPanel si muove alla pressione di un tasto da me definito. Si muove troppo lentamente nonostante abbia impostato la pausa dell'esecuzione a un millisecondo[Thread.sleep(1)]. Il programma � composto dal main che gestisce il JFrame principale e da un'altra classe che estende il JPanel, chiamata Point.

    Main

    codice:
    import javax.swing.JFrame;
    import java.awt.event.KeyListener;
    import java.awt.event.KeyEvent;
    public class Main extends JFrame{
     Point point=new Point();
     public Main(){
      super("PROVA");
      setExtendedState(JFrame.MAXIMIZED_BOTH);
      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      setVisible(true);
      addKeyListener(point);
      add(point);
      while(true){
       repaint();
      }
     }
     public static void main(String[] args){
      new Main();
     }
    }
    Point

    codice:
    import javax.swing.JPanel;
    import java.awt.event.KeyListener;
    import java.awt.event.KeyEvent;
    import java.awt.Graphics;
    import java.awt.Color;
    public class Point extends JPanel implements KeyListener{
     private int x=10;
     private int y=10;
     public void paintComponent(Graphics g){
      g.setColor(Color.BLACK);
      g.fillRect(x, y, 20, 20);
     }
     public void keyPressed(KeyEvent e){
      switch(e.getKeyChar()){
      case('d'):
       x++;
       try {
        Thread.sleep(1);
       } catch (InterruptedException e1) {
        e1.printStackTrace();
       }
      }
     }
     public void keyReleased(KeyEvent e){}
     public void keyTyped(KeyEvent e){}
    }

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Quote Originariamente inviata da Mistyflea Visualizza il messaggio
    Il mio problema riguarda la velocità con cui il mio JPanel si muove alla pressione di un tasto da me definito. Si muove troppo lentamente nonostante abbia impostato la pausa dell'esecuzione a un millisecondo[Thread.sleep(1)].
    Mi spiace, ma di "sensato" c'è poco, anzi quasi nulla.

    1) hai fatto partire la creazione della GUI nel "main" thread invece che nel Event Dispatch Thread. Questa in generale non è una cosa gravissima e generalmente non causa problemi ... a patto che l'ULTIMA cosa fatta sia il setVisible(true). Invece fai altro dopo. Quindi sarebbe meglio che apprendi meglio i concetti sul EDT.

    2) il while(true){ repaint(); } non ha assolutamente senso. Vuol dire che non hai (ancora) compreso come funziona il painting in Swing.

    3) il x++ è fatto a seguito di un evento causato dalla tastiera. La velocità con cui avviene non dipende dal programma Java ma DIPENDE da come è configurato il sistema riguardo la velocità di ripetizione dei tasti! (Sui Windows: pannello di controllo -> Tastiera)

    4) il Thread.sleep(1) nel keyPressed non ha senso ed è del tutto inutile. Se anche la velocità di ripetizione dei tasti fosse es. di 30 ripetizioni/secondo (= circa 33 millisecondi di intervallo), il fatto di "tardare" la terminazione del keyPressed di 1 millisecondo non cambia NULLA. E anzi, a seconda del sistema, non è affatto detto che la "granularità" dello sleep sia davvero del millisecondo!

    aggiungiamo un

    5) la prima istruzione del paintComponent da fare generalmente è un super.paintComponent(g); a meno che "sai" esattamente cosa stai facendo e perché.
    Ultima modifica di andbin; 15-08-2017 a 18:28
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

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 © 2024 vBulletin Solutions, Inc. All rights reserved.