Axel Richter: Fehlersuche, java Applett

Beitrag lesen

Hallo,

ich habe dieses Applet geschrieben, welches Zwei Skateborder zeigt, die dann Seperat mir der "A" bzw "L" Taste vorwärts bewegt werden können.
Dass hat wunderbar funktioniert,

Was zu beweisen wäre. Heißt: Das glaube ich Dir nicht.

Anmerkungen von mir als Kommentar in Deinem Code:

import java.applet.Applet;
import java.awt.Button;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

public abstract class Race extends Applet implements KeyListener, ActionListener {

//Anmerkung:
//Eine abstrakte Klasse kann nicht instantiiert werden. Das Applet scheitert also bereits hier. Warum soll die Applet Klasse abstract sein?

//private static final long serialVersionUID = -5951516822196894301L;

public int yA = 5;
public int yL = (95 + yA) + yA + 5;

public int score = 1;

private int aCounter = 0;
private int lCounter = 0;

TextField scoreInput = new TextField("20", 8);

public Race() {
super();
}

public void destroy() {
  System.out.println("destroy");
}

public void init(Graphics g) {

//Anmerkung:
//Beim Instatiieren eines Applets wird init() aufgerufen. Es wird nicht init(Graphics g) aufgerufen. Das Applet scheitert hier erneut ;-)

//this.setBackground(Color.red);
  this.setBounds(0, 0, 1000, 1000);
  this.addKeyListener(this);
  g.drawString("PRESS A OR L", 10, 12);

//Anmerkung:
//Das kann innerhalb der init() nicht funktionieren. Es gehört in die paint(Graphics g).

Button setScore = new Button("LOS");
  add(scoreInput);
  add(setScore);
  setScore.addActionListener(this);
}

public void start() {
}

public void stop() {
}

public void keyReleased(KeyEvent e) {
  if (aCounter <= score && lCounter <= score && score >= 10) {
   if ((int) e.getKeyChar() == 97) {
    ++aCounter;
   }
   else if ((int) e.getKeyChar() == 108) {
    ++lCounter;
   }
   else if ( e.getKeyChar() == 'c') {
    aCounter = 0;
    lCounter = 0;
    System.out.println("Couneters reseted.");
   }
   Race.this.repaint();
  }
}

//Anmerkung:
//Aha, ich glaube zu wissen, warum die Applet Klasse abstract wurde ;-). Wenn der Compiler die Meldung ausgibt, dass für einen KeyListener die abstakte Methode keyPressed unbedingt zu überschreiben ist, dann tu doch genau das, nämlich eine Methode

public void keyPressed(KeyEvent e) {
    }

//definieren, auch, wenn die erstmal gar nichts tut. Das Selbe gilt für keyTyped.

  
Das nächste Problem wird sein, dass Dein KeyListener eventuell nie anspricht, weil er nur reagiert, wenn die Komponente (AWTComponent), die er belauscht (hier das Applet), den Focus hat. Ob das Applet den Focus haben kann ist ungewiss. Besser wäre hier mit Swing (JApplet und KeyBindings für JComponent.WHEN\_IN\_FOCUSED\_WINDOW) zu arbeiten oder in einem AWT Applet eine eigene EventQueue zu implementieren und in dieser die KeyEvents abzufangen.  
  
viele Grüße  
  
Axel