Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    problemi durante la compilazione del programma che simula l'orologio

    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
    Giuseppe SPECCHIO

  2. #2
    changedUpdate(javax.swing.event.DocumentEvent) devi implementare il metodo nella classe che estende/implementa DocumentListener .
    Quando estendi o implementi una classe astratta, devi ridefinire tutti i suoi metodi se vuoi che non sia più astratta , altrimenti devi indicare la tua classe come astratta.
    Lang=Java
    Ambiente = Eclipse forever
    Ubuntu & Win XP Pro

  3. #3

    si ma..

    il problema viene sollevato alla riga della classe private il quale anche se la definisco come abstract il jdk mi solleva un eccezione
    Giuseppe SPECCHIO

  4. #4
    Utente di HTML.it L'avatar di floyd
    Registrato dal
    Apr 2001
    Messaggi
    3,837
    se la classe la fai astratta non puoi istanziarla DocumentListener listener = new ClockFieldListener();

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.