Sto implementando come esercizio preso da un libro, un programma in Java2 il quale deve simpulare un orologio analogico. Sintatticamente non ci sono errori ma al momento che compilo la classe di test ho il seguente messaggio di errore:
C:\j2sdk1.4.1_01\bin>javac TextTest.java
.\TextFrame.java:96: TextFrame.ClockFieldListener should be declared abstract; i
t does not define changedUpdate(javax.swing.event.DocumentEvent) in TextFrame.Cl
ockFieldListener
private class ClockFieldListener implements DocumentListener{
^
1 error
Di seguito è riportato il listato del programma:
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import javax.swing.*;
import javax.swing.event.*;
public class TextTest{
public static void main(String[] args){
TextFrame frame = new TextFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOS E); //permette di chiudere il frame
frame.show(); //visualizza il frame
}//main
}//TextTest
public class TextFrame extends JFrame{
/*** Variabili di Classe ***/
private JTextField hourField;
private JTextField minuteField;
private ClockPanel clock;
/*** 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 tre pulsanti
*/
public TextFrame(){
//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
//ButtonPanel panel = new ButtonPanel();
//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
DocumentListener listener = new ClockFieldListener();
//aggiunge un pannello con campi di testo
JPanel panel = new JPanel();
hourField = new JTextField("12",3); //crea un casella di testo impostando 12 come valore predefinito
panel.add(hourField);
hourField.getDocument().addDocumentListener(listen er);
minuteField = new JTextField("00",3);
panel.add(minuteField);
minuteField.getDocument().addDocumentListener(list ener);
contentPane.add(panel, BorderLayout.SOUTH); //posiziona le caselle di testo in basso
//aggiunge l'orologio
clock = new ClockPanel();
contentPane.add(clock, BorderLayout.CENTER);
}//TextFrame
/**
@effects Imposta l'orologio sui valori memorizzati nei campi ndi testo
*/
public void setClock(){
try{
/*
si utilizza la classe wrapper Integer con il metodo parseInt per
convertire la stringa presente nella casella di testo in intero
inolte si usa anche il metodo Trim() per eliminare inutili spazi bianchi
*/
int hours = Integer.parseInt(hourField.getText().trim());
int minutes = Integer.parseInt(minuteField.getText().trim());
clock.setTime(hours, minutes);
}catch(NumberFormatException e) {}
//non imposta l'orologio se l'input non è corretto
}//setClock
private class ClockFieldListener implements DocumentListener{
public void insertUpdate(DocumentEvent e){ setClock();}
public void removeUpdate(DocumentEvent e){ setClock();}
public void changeUpdate(DocumentEvent e){}
}//ClockFieldListener
}//TextFrame
public class ClockPanel extends JPanel{
/*** Variabili di Classe ***/
private double minutes = 0;
private double RADIUS = 100;
private double MINUTE_HAND_LENGTH = 0.8 * RADIUS;
private double HOUR_HAND_LENGTH = 0.6 * RADIUS;
private Image image; //rappresenta l'immagine di sfondo
/**
@requires richiede i package java.awt, java.awt.event, java.awt.geom, javax.swing e javax.swing.event
@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 orologio
*/
public void paintComponent(Graphics g){
//Disegna il contorno circolare
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
Ellipse2D circle = new Ellipse2D.Double(0, 0, 2*RADIUS, 2*RADIUS);
g2.draw(circle);
//disegna la lancetta delle ore
double hourAngle = Math.toRadians(90 - 360 * minutes / (12 * 60));
drawHand(g2, hourAngle, HOUR_HAND_LENGTH);
//disegna la lancetta dei minuti
double minuteAngle = Math.toRadians(90 - 360 * minutes / 60);
drawHand(g2, minuteAngle, MINUTE_HAND_LENGTH);
}//paintComponent
public void drawHand(Graphics2D g2,
double angle, double handLength){
Point2D end = new Point2D.Double(
RADIUS + handLength * Math.cos(angle),
RADIUS - handLength * Math.sin(angle));
Point2D center = new Point2D.Double(RADIUS, RADIUS);
g2.draw(new Line2D.Double(center, end));
}//drawHand
/**
@effects Imposta l'ora da visualizzare sull'orologio
@param h di tipo int, rappresenta le ore
@param m di tipo int, rappresenta i minuti
*/
public void setTime(int h, int m){
minutes = h * 60 + m;
repaint();
}//setTime
}//ClockPanel