SWT - KeyListener unterbricht immer am Anfang

  • Themenstarter Themenstarter HellYeah
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
H

HellYeah

Gast
Hallo @all,

ist es normal, das der Keylistener erst einmal auf einen Tastendruck reagiert, dann einen moment wartet nud dann dauerhaft schnell ausgeführt wird ?
Habe in meinem Beispiel einen roten Punkt, der sich gleichmäßig bewegen soll.
Wenn ich jetzt eine Taste drücke, wird sie einmal durchlaufen, unterbricht dann kurz und wird dann sehr schnell hintereinander abgefragt. Der Punkt "springt" einmal kurz, wartet und geht dann in eine fließende Bewegungüber.
Wie kriege ich es hin, das der Punkt sich von anfang an gleichmäßig bewegt ?

Code:
public static void main (String [] args) {
	
	Speed = 10 ;
	Bilder_Ordner = "bin" ;
	
	Display display = new Display ();
	
	Shell shell = new Shell(display);
	shell.setText("erster TEST") ;
	shell.setSize(500,500) ;
	
	//ImageData ideaData = new ImageData( "/"+Bilder_Ordner+"/char.bmp") ;
	ImageData ideaData = new ImageData( Snippet1.class.getClass().getResourceAsStream("/"+Bilder_Ordner+"/char.bmp"));
	
	int whitePixel = ideaData.palette.getPixel(new RGB(255,0,255));
	ideaData.transparentPixel = whitePixel;
	Image transparentIdeaImage = new Image(display,ideaData);
	
	label = new Label( shell , SWT.CENTER ) ;
	label.setText("HALLE") ;	
	label.setBounds(10,10,100,100) ;
	label.setImage( transparentIdeaImage ) ;
	
	shell.open ();

	shell.addKeyListener(new KeyListener() {

	      public void keyPressed(KeyEvent e) {
	    	  System.out.println("Key " + e.keyCode + " hit.");
		        switch ( e.keyCode ) {
		        case 97 :
		        	label.setLocation(label.getLocation().x-Speed , label.getLocation().y) ;
		        	break ;
		        case 100 :
		        	label.setLocation(label.getLocation().x+Speed , label.getLocation().y) ;
		        	break ;
		        case 115 :
		        	label.setLocation(label.getLocation().x , label.getLocation().y+Speed) ;
		        	break ;
		        case 119 :
		        	label.setLocation(label.getLocation().x , label.getLocation().y-Speed) ;
		        	break ;	        	
		        }
	      }

	      public void keyReleased(KeyEvent e) {
	      }
	    });	
	
	while (!shell.isDisposed ()) {
		if (!display.readAndDispatch ()) display.sleep ();	
		
		
	}

	display.dispose ();
	
	}
}
 
Es ist Sache das Betriebssystems wie schnell diese Events gefeuert werden.
Für die Steuerung die dir vorschwebt ist das der falsche Weg.
User drückt Knopf -> zB einen Bewegungsvektor auf Wert x setzen
User lässt Knopf los -> Bewegungsvektor zurücksetzen
 
Habs entsprechend umgeschrieben, funktioniert einwandfrei

DANKE DIR !


Code:
public static void main (String [] args) {
	
	Speed = 1 ;
	Bilder_Ordner = "bin" ;
	laufe = false ;
	
	Display display = new Display ();
	
	Shell shell = new Shell(display);
	shell.setText("erster TEST") ;
	shell.setSize(500,500) ;
	
	//ImageData ideaData = new ImageData( "/"+Bilder_Ordner+"/char.bmp") ;
	ImageData ideaData = new ImageData( Snippet1.class.getClass().getResourceAsStream("/"+Bilder_Ordner+"/char.bmp"));
	
	int whitePixel = ideaData.palette.getPixel(new RGB(255,0,255));
	ideaData.transparentPixel = whitePixel;
	Image transparentIdeaImage = new Image(display,ideaData);
	
	label = new Label( shell , SWT.CENTER ) ;
	label.setText("HALLE") ;	
	label.setBounds(10,10,100,100) ;
	label.setImage( transparentIdeaImage ) ;
	
	shell.open ();

	shell.addKeyListener(new KeyListener() {

	      public void keyPressed(KeyEvent e) {
	    	  laufe = true ; 
	    	  taste = e.keyCode ;
	      }

	      public void keyReleased(KeyEvent e) {
	    	  laufe = false ;
	      }
	    });	
	
	while (!shell.isDisposed ()) {
		if (!display.readAndDispatch ()) display.sleep ();
		
		if ( laufe == true ) {
	    	  System.out.println("Key " + taste + " hit.");
		        switch ( taste ) {
		        case 97 :
		        	label.setLocation(label.getLocation().x-Speed , label.getLocation().y) ;
		        	break ;
		        case 100 :
		        	label.setLocation(label.getLocation().x+Speed , label.getLocation().y) ;
		        	break ;
		        case 115 :
		        	label.setLocation(label.getLocation().x , label.getLocation().y+Speed) ;
		        	break ;
		        case 119 :
		        	label.setLocation(label.getLocation().x , label.getLocation().y-Speed) ;
		        	break ;	        	
		        }
		}
		
	}

	display.dispose ();
	
	}
}
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben