KeyListener

Status
Nicht offen für weitere Antworten.
G

Guest

Gast
Hallo,

der folgende Code sammelt leider alle Tastatureingaben in einer Warteschlange, und arbeitet alle Eingaben ab, wobei für JEDE Eingabe die KOMPLETTE zeitaufwendige Schleife ausgeführt wird!!!

Ziel: Wenn eine Tastatureingabe gemacht wird, dann soll die Schleife für die vorherige Tastatureingabe NICHT mehr zuende abgearbeitet werden. Die Schleife soll dann nur für die aktuelle Tastatureingabe neu ausgeführt werden.

Code:
public class GUI extends JFrame {
	static GUI fenster;
	...
	
	public static void main(String args[]) {	
		fenster = new GUI(); 		
		...
	}
	
	class KeyListener extends KeyAdapter {
		public void keyPressed(KeyEvent e) {		 
			if( e.getKeyCode() == KeyEvent.VK_LEFT ) 
			{
				left=true;
				fenster.repaint(); //Problem: die zeitaufwendige Schleife unten um Code wird komplett abgearbeitet, 
				//erst danach werden die nächsten Keyinputs abgearbeitet!
			}
			...
		}
	}	
	
	class BildLeinwand extends JPanel {
		public void paintComponent(Graphics g) {
			...
			for (int x=0; x<9999999; x++) { //Hier eine zeitaufwendige Schleife! }
		}
	}
	
	GUI() {
		...
		addKeyListener(new KeyListener()); 
	}
}
 

The_S

Top Contributor
Dein Code hilft da leider nicht viel weiter. Da kann man nur empfehlen, dass alles, was nicht zwingend in paintComponent erstellt werden muss, ausgelagert werden sollte (z. B. in Klassenvariablen falls möglich und dann in paint auf diese Variablen zugreifen und nicht jedesmal neu generieren).
 
G

Guest

Gast
Hobbit_Im_Blutrausch hat gesagt.:
Da kann man nur empfehlen, dass alles, was nicht zwingend in paintComponent erstellt werden muss, ausgelagert werden sollte
Meine zeitaufwändige Schleife in der paintComponent ist zu 99% damit beschäftigt unzählige Bilder von HDD zu lesen und zu zeichnen. D.h. man kann die paintComponent nicht wirklich schlänker/zeiteffektiver machen.

Ich Frage mich also nach wie vor was zu tun ist um mein Problem -siehe mein ersten Post- zu lösen? :(
 
S

SlaterB

Gast
> D.h. man kann die paintComponent nicht wirklich schlänker/zeiteffektiver machen.

doch, indem man diese 99% herausnimmt

solange paintComponent arbeitet, kannst du auf neue Tastatureingaben nicht reagieren,
diese Tatsache ist unumstößlich in Java,

in deinem Listener könntest du weniger oft repaint() aufrufen,
löst aber nur einen Teil deiner Probleme,
denn wenn paintComponent erst einmal losläuft..,

naja, einfach zu reparieren, wenn du nicht willst, dann eben nicht
 
G

Guest

Gast
SlaterB hat gesagt.:
doch, indem man diese 99% herausnimmt
solange paintComponent arbeitet, kannst du auf neue Tastatureingaben nicht reagieren, diese Tatsache ist unumstößlich in Java
Aha, danke.

SlaterB hat gesagt.:
in deinem Listener könntest du weniger oft repaint() aufrufen
Hmm, das repaint stößt doch aber die Ausführung des Codes in der paintComponent an. Und es ist mein Ziel das bei jeder Keyeingabe der komplette Code der paintComponent gezeichnet wird.

SlaterB hat gesagt.:
naja, einfach zu reparieren, wenn du nicht willst, dann eben nicht
Hab den Code von PaintComponent in eine zeichnen-Methode ausgelagert. Und was mach in nun?
Denn ich hab weiterhin das Problem welches ich in meinem ersten Post beschrieben habe.

Code:
public class GUI extends JFrame { 
	static GUI fenster; 
	... 
	
	public static void main(String args[]) {    
		fenster = new GUI();        
		... 
	} 
	
	class KeyListener extends KeyAdapter { 
		public void keyPressed(KeyEvent e) {       
			if( e.getKeyCode() == KeyEvent.VK_LEFT ) 
			{ 
				left=true; 
				zeichnen();//Problem: die zeitaufwendige Schleife unten um Code wird komplett abgearbeitet, 
				//erst danach werden die nächsten Keyinputs abgearbeitet! 
			} 
			... 
		} 
	}
	
	void zeichnen () {
		Graphics g = getGraphics(); 
		for (int x=0; x<9999; x++) { //Hier eine zeitaufwendige Schleife! }         
		}
		
		class BildLeinwand extends JPanel { 
			public void paintComponent(Graphics g) { 
				//hier kein Code mehr. Code nun in der Methode "zeichnen"			}
			public Dimension getPreferredSize() { 
				...
				return new Dimension(...);
			}
		} 
		
		GUI() { 
			... 
			addKeyListener(new KeyListener()); 
		} 
	}
 

The_S

Top Contributor
Du könntest z. B. deine Bilder als Klassenvariable laden, dann musst du sie schon nicht direkt in paintComponent laden. Du kannst repaint auch Parameter übergeben - dann wird nur ein bestimmter Bereich neugezeichnet.

Anschließend sehen wir weiter ;) .
 
G

Guest

Gast
Hobbit_Im_Blutrausch hat gesagt.:
Du könntest z. B. deine Bilder als Klassenvariable laden
Sorry, was heisst als Klassenvariable laden? Wo müsste ich deinen Vorschlag in meinen Code reincoden, und wie sieht der Code dazu aus?

Ich lade meine Bilder übrigens so:
Code:
bild = ImageIO.read(new File(...));
g.drawImage(bild, ...,...,...,...,this);

Aber wieder zum anderen Thema:
In meinen Code meiner vorherigen Post hab ich die Zeile:
System.out.println("Tastatur wurde betätigt");
hinzugefügt. Was ich aber gar nicht verstehe:
Meine zeichnen-Methode wird zuerst leider KOMPLETT ausgeführt, erst danach spuckt er mir die System.out.println-Meldung aus!? Er müsste mir doch eigentlich die System-out Meldung sofort beim Tastaturdrücken anzeigen, oder?!

Code:
if( e.getKeyCode() == KeyEvent.VK_LEFT ) 
         { 
            left=true; 
            System.out.println("Tastatur wurde betätigt");
            zeichnen();//Problem: die zeitaufwendige Schleife unten um Code wird komplett abgearbeitet, 
            //erst danach werden die nächsten Keyinputs abgearbeitet! 
         }
 
S

SlaterB

Gast
rufe niemals in irgendeinem deiner Programm getGraphics(); auf,
das ist ein weiterer sehr guter allgemeiner Tipp

bleibe bei paintComponent();

---------

was genau ist eigentlich auf dem Bildschirm vor/ während des Ladens der 9999 Bilder zu sehen?

du brauchst einen Thread,
mit einer Hauptoperation
managePaint() {
1. evtl. Vorzeichen, maximal 100ms
2. Bilder laden, dauert lange, nach jedem Bild prüfen, ob abgebrochen werden soll
3. Bilder zeichen, maximal 100ms
}

nach einem Button-Klick wird die Operation gestartet, wenn sie noch nicht läuft

ansonsten wird ein Feld 'sarte von vorne' markiert
und die Operation managePaint() prüft das ja nach jeden Bild,
malt evtl. irgendwas in diesem Sonderfall,
und fängt wieder von vorne an

-----------


> Und es ist mein Ziel das bei jeder Keyeingabe der komplette Code der paintComponent gezeichnet wird.

nein, dein Ziel ist es, den kompletten Code auch abbrechen zu können,
das zählt höher, daher muss du dich anpassen
 
S

SlaterB

Gast
Anonymous hat gesagt.:
Meine zeichnen-Methode wird zuerst leider KOMPLETT ausgeführt, erst danach spuckt er mir die System.out.println-Meldung aus!? Er müsste mir doch eigentlich die System-out Meldung sofort beim Tastaturdrücken anzeigen, oder?!

ein Grund mehr, die GUI nicht allzulange zu blockieren,
System.out ist gepuffert und wird nur von Zeit zu Zeit weitergeleitet, wenn ich mich recht erinnere
(Vermutung)
 
G

Guest

Gast
SlaterB hat gesagt.:
rufe niemals in irgendeinem deiner Programm getGraphics(); auf, das ist ein weiterer sehr guter allgemeiner Tipp.
bleibe bei paintComponent();
Jetzt bin ich aber froh -dank einer deiner ersten Posts- es doch nicht mit paintComponent realisiert zu haben :bae:
Denn mit PaintComponent blitzte das fertig berechnete Bild bei mir nach der langen Berechnung erst am Ende nur kurz auf, und verschwindet dann sofort, kann aber auch gut daran liegen dass ichs nicht so richtig gecodet hab.

SlaterB hat gesagt.:
du brauchst einen Thread,
managePaint() {
2. Bilder laden, dauert lange, nach jedem Bild prüfen, ob abgebrochen werden soll
3. Bilder zeichen, maximal 100ms
}

Danke, jetzt funtzt es! :D (Ich habs jetzt doch nicht wie empfohlen mit paintComponent realisiert, aber hauptsache es funtzt ;) )
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
MaRkElE KeyListener Verzögerung deaktivieren AWT, Swing, JavaFX & SWT 1
P JTextfield Text durch Keylistener verändern AWT, Swing, JavaFX & SWT 4
N Keylistener & JComboBox AWT, Swing, JavaFX & SWT 5
B Swing JButton mit KeyListener AWT, Swing, JavaFX & SWT 3
H KeyListener funktioniert nicht AWT, Swing, JavaFX & SWT 1
Fridolin111 Der KeyListener Löst kein event aus AWT, Swing, JavaFX & SWT 6
B KeyListener auf JFrame reagiert nicht AWT, Swing, JavaFX & SWT 8
N Mit KeyListener ein rechteck zeichnen AWT, Swing, JavaFX & SWT 9
S Swing JPanel nimmt keinen KeyListener an AWT, Swing, JavaFX & SWT 7
P JPanel KeyListener hinzufügen AWT, Swing, JavaFX & SWT 8
B Swing KeyListener auf Container? AWT, Swing, JavaFX & SWT 1
T Event Handling KeyListener reagiert nicht AWT, Swing, JavaFX & SWT 10
K KeyListener ohne JFrame AWT, Swing, JavaFX & SWT 9
C Keylistener funktioniert nicht AWT, Swing, JavaFX & SWT 1
T KeyListener funktioniert nicht wenn ich ein JButton hinzufüge AWT, Swing, JavaFX & SWT 1
A Event Handling Muss ich 'KeyListener' tasuend mal zufügen? AWT, Swing, JavaFX & SWT 7
S mit keylistener frame schliessen AWT, Swing, JavaFX & SWT 8
S Keylistener reagiert bei Buttons nicht. AWT, Swing, JavaFX & SWT 8
S KeyListener funktioniert nicht AWT, Swing, JavaFX & SWT 2
R KeyListener in mehreren Panels AWT, Swing, JavaFX & SWT 5
V Tastatur KeyListener für mehrere Buttons AWT, Swing, JavaFX & SWT 1
J JLabel Visible setzen in KeyListener AWT, Swing, JavaFX & SWT 13
X KeyListener AWT, Swing, JavaFX & SWT 0
L KeyListener für JDialog AWT, Swing, JavaFX & SWT 7
N KeyListener funktioniert nicht richitg AWT, Swing, JavaFX & SWT 4
Z SnakeGame Schlange per KeyListener bewegen! AWT, Swing, JavaFX & SWT 10
T KeyListener AWT, Swing, JavaFX & SWT 2
GianaSisters JFrame mit JInternalFrames, Keylistener-Problem AWT, Swing, JavaFX & SWT 9
7 KeyListener tastatur temporär blockieren AWT, Swing, JavaFX & SWT 7
7 AWT problem: KeyListener/ test im Label umändern AWT, Swing, JavaFX & SWT 4
B SWT Problem: Wie kann man für jede TableColumn einen eigenen KeyListener registrieren. AWT, Swing, JavaFX & SWT 1
U Mouse + Keylistener AWT, Swing, JavaFX & SWT 12
K ActionListener mit KeyListener AWT, Swing, JavaFX & SWT 7
J JWindow und keylistener AWT, Swing, JavaFX & SWT 1
F JavaFX KeyListener zum Fenster öffnen/schließen AWT, Swing, JavaFX & SWT 9
A Swing KeyEvent mit KeyListener und KeyAdapter kürzer schreiben AWT, Swing, JavaFX & SWT 7
D JTextArea auf KeyListener Command AWT, Swing, JavaFX & SWT 6
C KeyListener AWT, Swing, JavaFX & SWT 5
Doopy Event Handling KeyListener funktioniert nach Restart nicht mehr AWT, Swing, JavaFX & SWT 7
S KeyListener geht nicht AWT, Swing, JavaFX & SWT 12
C Swing KeyListener in JPanel AWT, Swing, JavaFX & SWT 2
A KeyListener Button wechseln & Programm beenden AWT, Swing, JavaFX & SWT 4
M Frage zu KeyListener bzgl. JApplet AWT, Swing, JavaFX & SWT 3
H Bild mit KeyListener verschieben AWT, Swing, JavaFX & SWT 2
C JTextField KeyListener AWT, Swing, JavaFX & SWT 6
Y KeyListener, GUI Thread, repaint AWT, Swing, JavaFX & SWT 7
bluerob Fehler bei Wertübermittlung über KeyListener AWT, Swing, JavaFX & SWT 3
E Swing KeyListener implementieren AWT, Swing, JavaFX & SWT 12
P KeyListener reagiert nicht AWT, Swing, JavaFX & SWT 11
M KeyListener richtig implementieren AWT, Swing, JavaFX & SWT 3
T KeyListener AWT, Swing, JavaFX & SWT 4
R KeyListener in JWindow AWT, Swing, JavaFX & SWT 7
T BlueJ KeyListener AWT, Swing, JavaFX & SWT 7
Z KeyListener AWT, Swing, JavaFX & SWT 2
M Swing KeyListener in JTextfield AWT, Swing, JavaFX & SWT 4
C Swing KeyListener für JPanel funktioniert nicht AWT, Swing, JavaFX & SWT 8
VfL_Freak Swing KeyListener, um einen Dialog per ESC zu schließen AWT, Swing, JavaFX & SWT 6
A Keylistener reagiert nicht AWT, Swing, JavaFX & SWT 10
D Problem mit KeyListener AWT, Swing, JavaFX & SWT 2
J KeyListener um auf CTRL-Enter zu reagieren AWT, Swing, JavaFX & SWT 2
L Snake in Java KeyListener Problem AWT, Swing, JavaFX & SWT 30
B "globaler" KeyListener? AWT, Swing, JavaFX & SWT 3
B JTable TableHeader KeyListener AWT, Swing, JavaFX & SWT 4
S Swing KeyListener und JList AWT, Swing, JavaFX & SWT 2
R KeyListener funzt nicht AWT, Swing, JavaFX & SWT 2
X KeyListener AWT, Swing, JavaFX & SWT 4
P KeyListener + Animation AWT, Swing, JavaFX & SWT 2
M Fokus für KeyListener AWT, Swing, JavaFX & SWT 9
V Problem mit KeyListener im Fullscreen-Modus AWT, Swing, JavaFX & SWT 2
M AWT KeyListener reagiert nicht AWT, Swing, JavaFX & SWT 10
C Swing KeyListener reagiert nicht AWT, Swing, JavaFX & SWT 7
K JFrame + KeyListener + Runnable = Fehler AWT, Swing, JavaFX & SWT 3
F Tastenabfrage (KeyListener) AWT, Swing, JavaFX & SWT 2
D KeyListener Problem bei JPanel wechsel AWT, Swing, JavaFX & SWT 2
S Swing JTree mit KeyListener AWT, Swing, JavaFX & SWT 2
L AWT KeyListener, requestFocus und KeyBindings AWT, Swing, JavaFX & SWT 8
E JFrame akzeptiert den KeyListener nicht AWT, Swing, JavaFX & SWT 3
F Swing Problem mit KeyListener||paintComponent() in JFrame AWT, Swing, JavaFX & SWT 12
P Swing KeyListener hört nur manchmal zu AWT, Swing, JavaFX & SWT 2
Screen Focus Problem , KeyListener, TextField , Key AWT, Swing, JavaFX & SWT 4
earlgrey_tea AWT KeyListener bekommt keine Signale AWT, Swing, JavaFX & SWT 3
L Problem mit KeyListener AWT, Swing, JavaFX & SWT 3
A KeyListener funktioniert nicht AWT, Swing, JavaFX & SWT 4
D KeyListener-Problem nach dem "Gedrückthalten" einer Taste AWT, Swing, JavaFX & SWT 10
B Swing Keylistener fuer Dialog-Buttons AWT, Swing, JavaFX & SWT 2
B KeyListener Strg+s AWT, Swing, JavaFX & SWT 5
D Globaler Keylistener AWT, Swing, JavaFX & SWT 4
M problem mit keylistener/textarea AWT, Swing, JavaFX & SWT 6
M KeyListener Problem unter Firefox AWT, Swing, JavaFX & SWT 2
L AWT KeyListener, Taste gedrückt halten AWT, Swing, JavaFX & SWT 12
M Komisches Verhalten: JCombobox mit KeyListener AWT, Swing, JavaFX & SWT 13
capgeti SWT KeyListener 2 Tasten Problem AWT, Swing, JavaFX & SWT 3
R KeyListener - welcher Komponente hinzufügen AWT, Swing, JavaFX & SWT 5
Developer_X AWT KeyListener wird nicht ausgeführt! AWT, Swing, JavaFX & SWT 3
N JFrame und KeyListener AWT, Swing, JavaFX & SWT 6
M KeyListener reagiert nach Buttondruck nicht mehr AWT, Swing, JavaFX & SWT 4
A AWT Button verhindert ausführung vom Keylistener AWT, Swing, JavaFX & SWT 4
R KeyListener hinzufügen AWT, Swing, JavaFX & SWT 7
T Swing KeyListener mit mehreren Objekten AWT, Swing, JavaFX & SWT 2
G KeyListener AWT, Swing, JavaFX & SWT 3

Ähnliche Java Themen

Neue Themen


Oben