KeyListener, GUI Thread, repaint

Y

yyannekk

Gast
moin,
ich hab ma ne Frage zur Ausführung von repaint eines JComponent Objekts. Ich hab ein JFrame in dem das contentPane zu dem JComponente (JPanel) gesetzt ist. Das frame hat einen KeyListener.

in etwa so:
Java:
public class TestRepaint implements KeyListener
{
private class CanvasPane extends JPanel{ public void paint( Graphics g ) { g.drawImage(image,0,0,null);}
public TestRepaint(){ 
frame.addKeyListener(this);
canvas=new CanvasPane();
frame.setContentPane(canvas);
}
public void keyPressed(KeyEvent arg){ canvas.repaint(); // das fenster zeigt neuen Inhalt erst //nachdem keyPressed durch ist an
}
}

Wenn des KeyListeners Methoden aufgerufen werden, und in diese das JPanel neu zeichnen, dann wird es erst nach dem Durchlaufen der KeyListener Methode ausgeführt.

Warum ist das so? Wenn ich das repainten in einen eigenen Thread auslagere wird es "parallel" ausgeführt. Denke mal es hat also mit dem GUI Thread oder so zu tun, aber warum kann der sich nicht zwischendurch neuzeichnen. Wär nett wenn mir da jemand Hintergrund infos geben könnte, oder wo man das nachlesen kann.

Ich habe nämlich das Problem, dass ich sozusagen einen Ladebalken anzeigen will. Wäre es zB eine gute Lösung es folgendermaßen zu machen:
Java:
public void keyPressed(KeyEvent e)
{
new Thread(){
public void run(){
//hier laden und neuzeichnen
} 
}.start();
}
 

bERt0r

Top Contributor
Also 1. wo kommt denn den frame her?
2. Wo kommt dein image her?
3. Benutzt du java 6 oder 7? Ein canvas mit einem JFrame zu mischen ist nämlich nicht das gelbe vom Ei.
 
Y

yyannekk

Gast
frame und image sind member von TestRepaint

das wäre ein ausführbares Beispiel:

Java:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.image.BufferedImage;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class TestRepaint implements KeyListener {
	public static void main(String[] args) {
		new TestRepaint();
	}

	private JFrame frame;
	private CanvasPane canvas;
	private BufferedImage canvasImage;

	public TestRepaint() {
		frame = new JFrame();
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.addKeyListener(this);
		canvasImage = new BufferedImage(100, 100, BufferedImage.TYPE_INT_ARGB);
		canvas = new CanvasPane();
		canvas.setPreferredSize(new Dimension(100, 100));
		frame.setContentPane(canvas);
		frame.pack();
		frame.setVisible(true);

	}

	private class CanvasPane extends JPanel {
		@Override
		public void paint(Graphics g) {
			g.drawImage(canvasImage, 0, 0, null);
		}
	}

	@Override
	public void keyPressed(KeyEvent arg0) {
		//hier mal n bischen malen, wird erst nach keyPressed dargestellt
                //lösung: malen in neuen Thread auslagern
                                Graphics g = canvasImage.getGraphics();
				g.setColor(Color.white);
				g.fillRect(0, 0, 100, 100);

				for (int i = 0; i < 5; i++) {
					g.setColor(Color.black);
					g.drawString("" + i + "...", 10, 15 + 15 * i);
					g.dispose();
					canvas.repaint();
					try {
						Thread.sleep(1000);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}

	}

	@Override
	public void keyReleased(KeyEvent arg0) {
		// TODO Auto-generated method stub

	}

	@Override
	public void keyTyped(KeyEvent arg0) {
		// TODO Auto-generated method stub

	}

}
 
Zuletzt bearbeitet von einem Moderator:

kaetzacoatl

Bekanntes Mitglied
[JAPI]java.awt.event.KeyEvent[/JAPI]
hilft dir vielleicht weiter.
Die keyPressed Methode wird nämlich immer aufgerufen,
wenn eine Taste gedrückt wird, dass führt dazu,
dass die Methode mehrmals aufgerufen wird.
Da die Methode dauernd wartet, wartet der Thread viel zu lange.
Ich würde eine andere Methode verwenden.
 

bERt0r

Top Contributor
anvasImage.getGraphics();
Au au au au. Lies dir das Zeichnen in Swing Tutorial durch, da wird dein Fehler genau beschrieben.

Edit ne warte mal, da hab ich nicht genau genug geschaut. Das mit dem sleep is wohl eher das Problem. Wieso muss dein canvas pro tastendruck 5 mal neu gezeichnet werden? Ich würde sagen, pfeiff auf dein Image, zeichne in der paintComponent Methode und ruf repaint dafür sauber auf.
 
Zuletzt bearbeitet:
Y

yyannekk

Gast
also ich weiß nicht ob ihr genau gelesen habt was das Problem ist:
Wenn des KeyListeners Methoden aufgerufen werden, und in diese das JPanel neu zeichnen, dann wird es erst nach dem Durchlaufen der KeyListener Methode angezeigt.
Warum ist das so?

Ich meine in der KeyListener Methode wird repaint() von dem JComponent Objekt aufgerufen, es wird aber erst nachdem keyPressed durchgelaufen ist angezeigt.

Das mit dem sleep is wohl eher das Problem.
Warum ist sleep das Problem?

Wieso muss dein canvas pro tastendruck 5 mal neu gezeichnet werden? Ich würde sagen, pfeiff auf dein Image, zeichne in der paintComponent Methode und ruf repaint dafür sauber auf.
ist erstmal nicht so wichtig. Da ich ja auch schon wie geschrieben eine Lösung für das mehrmalige Zeichnen habe, ist nicht die Lösung das primäre Problem, sondern das Verstehen....
 

bERt0r

Top Contributor
Weil dein sleep den EDT blockiert. Repaint zeichnet nichts. Repaint sagt dem RepaintManager, dass er in nächster Zeit mal neu zeichnen soll. Der kommt aber nicht dazu, weil du mit dienem Thread.sleep den Thread einfrierst, der ihn aufruft.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
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
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
E KeyListener AWT, Swing, JavaFX & SWT 5
L Focus für KeyListener auf verschiedene Panels AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben