To querendo mover com o teclado um oval desenhado num Jpanel. Mas gera um erro muito extranho:
Exception in thread "main" java.lang.StackOverflowError
at sun.awt.windows.WToolkit.getScreenInsets(Native Method)
at sun.awt.windows.WToolkit.getScreenInsets(WToolkit.java:547)
at java.awt.Window.init(Window.java:394)
at java.awt.Window.
at java.awt.Frame.
at java.awt.Frame.
at javax.swing.JFrame.
at TrandoEventosTec.
at TrandoEventosTec.
As classes:
import java.awt.event.KeyListener;
import java.awt.event.KeyEvent;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import java.awt.Graphics;
public class TrandoEventosTec extends JFrame implements KeyListener {
public static void main(String[] args) {
TrandoEventosTec a = new TrandoEventosTec();
}
int x = 30;
Painel painel;
public TrandoEventosTec() {
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
painel = new Painel();
TrandoEventosTec teclado = new TrandoEventosTec();
teclado.add(painel);
// ele é seu próprio escutador de eventos
addKeyListener(this);
setSize(640, 480);
setVisible(true);
}
public void keyPressed(KeyEvent ek){
if(ek.getKeyCode() == KeyEvent.VK_BACK_SPACE){
painel.movaOval();}
}
public void keyTyped(KeyEvent ek) { }
public void keyReleased(KeyEvent ek) { }
}
A que desenha:
import java.awt.Graphics;
import javax.swing.JPanel;
class Painel extends JPanel {
int x = 20;
public void paintComponent(Graphics g){
super.paintComponent(g);
movaOval();
g.fillOval(x, x, 30, 30);
//super.repaint();
}
void movaOval(){
x+=10;
}
}
O que sei é que se eu tirar :
TrandoEventosTec teclado = new TrandoEventosTec();
teclado.add(painel);
por simplesmente:
this.add(painel);
Esse erro desaparece! Mas não sei se o que fiz é equivalente ao anterior!
Mas o que sei é que apesar do oval aparecer desenhado no Jpanel qnd clico no BACK_SPACE nada acontece!!!
Ajudem por favor!