Come esercitazione nella programmazione Java2 sto cercando d'implementare un gioco tipo il famoso Snake, e precisamente ho impostato il lavoro su tre classi, una di test, una che crea il Jframe, e l'altra che mi crea il Jpanel e gestisce gli eventi mediante una sua classe annidata. Il problema l'ho avuto nel momento della compilazione proprio di quest'ultima classe, ed in particolar modo ho avuto il seguente messaggio di errore:
C:\j2sdk1.4.1_01\bin>javac SketchPanel.java
SketchPanel.java:128: SketchPanel.KeyHandler should be declared abstract; it doe
s not define keyReleased(java.awt.event.KeyEvent) in SketchPanel.KeyHandler
private class KeyHandler implements KeyListener{
^
Note: SketchPanel.java uses or overrides a deprecated API.
Note: Recompile with -deprecation for details.
1 error
Di seguito viene riportato il listato del programma:
import java.awt.*;
import java.awt.geom.*;
import java.util.*;
import java.awt.event.*;
import javax.swing.*;
public class SketchTest{
public static void main(String[] args){
SketchFrame frame = new SketchFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOS E); //permette di chiudere il frame
frame.show(); //visualizza il frame
}//main
}//SketchTest
---------------------------------------------------------
public class SketchFrame extends JFrame{
/*** Costruttore ***/
/**
@requires richiede i package java.awt, java.awt.even e javax.swing
@effects dopo aver acquisito le impostazioni dello schermo dal sistema operativo crea un frame il quale risulterà un quarto dell'intero schermo
@return restituisce un frame pari ad 1/4 del video contenente una figura gestibile con itasti della tastiera
*/
public SketchFrame(){
//acquisisce le dimensioni dello schermo
// La classe Toolkit iteragisce con il sistema operativo
Toolkit kit = Toolkit.getDefaultToolkit();
Dimension screenSize = kit.getScreenSize(); //restituisce la dimensione dello schermo come oggetto Dimension
int screenHeight = screenSize.height;
int screenWidth = screenSize.width;
//centra il frame nello schermo
setSize(screenWidth/2, screenHeight/2); //dimezza la larghezza ed altezza delle dimensioni del video precdentemente acquisite
setLocation(screenWidth/4, screenHeight/4); //consente di riposizionare il frame
//imposta l'icona ed il titolo del frame
Image img = kit.getImage("icon.gif");
setIconImage(img); //prende un oggetto img e lo usa come icona del frame
setTitle("Giuseppe SPECCHIO - Progetto LI4"); //imposta il titolo del frame
//aggiunge un pannello al frame
SketchPanel panel = new SketchPanel();
panel.setBackground(SystemColor.window); //imposta il colore di sfondo del frame sul colore predefinto nel sistema operativo
Container contentPane = getContentPane(); //restituisce l'oggetto pannello del contenuto del JFrame
contentPane.add(panel); //aggiunge il pannello al frame
}//SketchFrame
}//SketchFrame
-----------------------------------------
public class SketchPanel extends JPanel{
/*** Variabili di Classe ***/
//private Image image; //rappresenta l'immagine di sfondo
private Point2D last; //rappresenta l'estremo più anziano della linea
private ArrayList lines; //rappresenta l'insieme di punti che definiranno gli estremi le linee
private static final int SMALL_INCREMENT = 1;
private static final int LARGE_INCREMENT = 5;
/*** Costruttore ***/
/**
@requires richiede i package java.awt, java.awt.event, java.awt.geom, java.util e javax.swing
@effects dopo aver acquisito le impostazioni dello schermo dal sistema operativo crea un frame il quale risulterà un quarto dell'intero schermo
@return restituisce un pannello con un'immagine da disegnare con la tastiera premendo le frecce od i tasti 'h', 'l', 'k', 'j'
*/
public SketchPanel(){
//acquisisce l'immagine di sfondo
/* image = Toolkit.getDefaultToolkit().getImage("Background.g if");
MediaTracker tracker = new MediaTracker(this);
tracker.addImage(image, 0); //aggiunge image all'elenco d'immagini da caricare
try{ tracker.waitForID(0);} //attende che siano caricate tutte le immagini con l'id specificato
catch (InterruptedException exception) {}
*/
last = new Point2D.Double(100,100); //il primo punto parte da posizione (100,100)
lines = new ArrayList(); //memorizza l'insieme di punti che definiranno gli estremi delle linee
KeyHandler listener = new KeyHandler(); //gestore venti da tatsiera
addKeyListener(listener); //inserisce gli eventi nella lista eventi da tastiera
}//SketchPanel
public void paintComponent(Graphics g){
super.paintComponent(g);
/*
//acquisisce le dimensioni dello schermo
// La classe Toolkit iteragisce con il sistema operativo
Toolkit kit = Toolkit.getDefaultToolkit();
Dimension screenSize = kit.getScreenSize(); //restituisce la dimensione dello schermo come oggetto Dimension
int screenHeight = screenSize.height;
int screenWidth = screenSize.width;
//disegna l'immagine
g.drawImage(image, 0, 0, null); //per ottenere l'immagine al centro del frame????
*/
Graphics2D g2 = (Graphics2D)g;
//disegna tutte le linee
for(int i = 0; i < lines.size(); i++)
g2.draw((Line2D)lines.get(i));
}//paintComponent
/*
@effects permette al pannello di aver il focus in input
*/
public boolean isFocusTraversable(){
return true;
}//isFocusTraversable
/*
@effects Aggiunge un nuovo segmento di linea al disegno
@param dx il movimento è nella direzione x
@param dy il movimento è nella direzione y
*/
public void add(int dx, int dy){
//calcola il nuovo punto finale
Point2D end = new Point2D.Double(last.getX() + dx, last.getY() + dy);
//aggiunge un segmento di linea
Line2D line = new Line2D.Double(last, end);
lines.add(line);
repaint();
//ricorda nuovo punto finale
last = end;
}//add
/* @effects quando si fa clic su un pulsante, si cambiano le impostazioni del sistema.
Inoltre dato che la classe ColorAction non può accedere alle impostazioni dela pannello
la s'imposta annidata, ecco il perchè qui della sua presenza.
@param name di tipo String, il quale rappresenta il nome del pulsante
@param plafName di tipo String, il quale rappresenta il nome della classe di ambientazione
*/
/*
void makeButton implements ActionListener{
//aggiunge un pulsante al pannello
JButton button = new JButton(name);
add(button);
//imposta l'azione del pulsante
button.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent event){
//azione del pulsante: nuova ambientazione
try{
UIManager.setLookAndFeel(plafName); //cambia dinamicamente le impostazioni
SwingUtilities.updateComponentTreeUI(PlafPanel.thi s); //aggiorna le impostazioni
}catch(Exception e){
e.printStackTrace();
}//catch
}//actionPerformed
}
}//makeButton
*/
/*
@effects Gestisce gli venti da tastiera
*/
private class KeyHandler implements KeyListener{
/*
@effects gestisce gli eventi delle frecce
*/
public void keyPressed(KeyEvent event){
int keyCode = event.getKeyCode(); //restituisce il codice del tasto virtuale premuto
//imposta la distanza
int d;
//se l'utente ha premuto il tasto MAIUSC usa l'incremento maggiore
if(event.isShiftDown())
d = LARGE_INCREMENT;
else
d = SMALL_INCREMENT;
//aggiunge un segmento di linea
if(keyCode == KeyEvent.VK_LEFT) //se il tasto premuto è la freccia sinistra
add(-d, 0);
else if (keyCode == KeyEvent.VK_RIGHT) //se il tasto premuto è la freccia destra
add(d, 0);
else if (keyCode == KeyEvent.VK_UP) // se il tasto premuto è freccia sù
add(0, -d);
else if (keyCode == KeyEvent.VK_DOWN) // se il tasto premuto è freccia giù
add(0, d);
}//keyPressed
/*
E' un metodo Adapter
@effects sfrutta il metodo della supeclasse il quale gestisce l'evento rilascio del tasto
*/
//public void keyRelased(KeyEvent event){}//keyrelased
/*
@effects gestisce gli eventi con i tasti
*/
public void keyTyped(KeyEvent event){
int keyChar = event.getKeyChar(); //restituisce il codice del carattere premuto
//imposta la distanza
int d;
//se l'utente ha premuto il tasto MAIUSC usa l'incremento maggiore
if(event.isShiftDown())
d = LARGE_INCREMENT;
else
d = SMALL_INCREMENT;
//aggiunge un segmento di linea
if(keyChar == 'h')
add(-d, 0);
else if (keyChar == 'l') //se il tasto premuto è la freccia destra
add(d, 0);
else if (keyChar == 'k') // se il tasto premuto è freccia sù
add(0, -d);
else if (keyChar == 'j') // se il tasto premuto è freccia giù
add(0, d);
}//keyTyped
}//KeyHandler
}//SketchPanel

Rispondi quotando

