[Solucionado]Alarma en Java. (Ayuda con uso de TimerTask y JPanel)

Imagen de danirolo7
0 puntos

Hola, buenos días.

Estoy un poco liado con un programa bastante sencillo, se trata de una alarma en Java. La idea es crear una interfaz bastante sencilla, con un JTextField que refresque la hora actual (con un Calendar y un TimerTask lo estoy intentando). Luego tres TextFields para poner hora, minutos y segundos, un botón para activar y otro para desactivar. Pues mi idea es hacerlo así:

-Creo una clase Panel que hereda de JPanel e implementa la interfaz ActionListener. En esta clase defino la interfaz y pongo los botones en modo escucha. Dentro de esta clase creo otra clase anónima Reloj que hereda de TimerTask con el método run() que actualiza la hora.

El problema viene en la clase principal RelojAlarma, que contiene el método main y no sé cómo sacar el TimerTask sin que me diga que la variable no estática no se puede usar en un contexto estático, a menos que me líe a poner statics a todo xD.

Si alguien quiere echarme una mano con una idea diferente y más fácil de hacerlo, es bienvenida; así mismo, si alguien quiere ver el código, está disponible en GitHub como Git de sólo lectura o como HTTP.

Gracias, un saludo.

Imagen de alexg88
+1
0
-1

En la clase RelojAlarma sólo tendría que llamar a pa.rel para obtener la referencia al objeto de tipo Reloj que creas en la clase panel.

package relojalarma;
import javax.swing.JFrame;
import java.util.Timer;

public class RelojAlarma {

    public static void main(String[] args) {
        JFrame app=new JFrame();
        Timer tm=new Timer();
        Panel pa=new Panel();
        app.setSize(300,300);
        app.setTitle("Alarma MegaGuay");
        app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        app.add(pa);
        app.setVisible(true);
        tm.schedule(pa.rel,0,1000);
    }
}

También podrías haber puesto el temporizador dentro de la propia clase Panel lo que te quitaría bastantes problemas. Así quedaría la clase Panel:

package relojalarma;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Calendar;
import javax.swing.JOptionPane;
import java.util.TimerTask;
import java.util.Timer;

/**
 *
 * @author Daniel Netbook
 */
public class Panel extends JPanel implements ActionListener{
    private JLabel horaLabel;
    private JButton botonActivar;
    private JButton botonAnular;
    private JLabel ponerAlarmaLabel;
    private JLabel dosPuntos;
    private JLabel h;
    private JLabel m;
    private JLabel s;
    public JTextField horaActual;
    public JTextField horaAlarma;
    public JTextField minAlarma;
    public JTextField segAlarma;
    public int minutoAlarma;
    public int segundoAlarma;
    public int horasAlarma;
    private Reloj rel;
    private Timer tm;
    
    public Panel(){
        setLayout(null);
        horaLabel=new JLabel("Hora Actual: ");
        horaLabel.setBounds(10,10,100,40);
        this.add(horaLabel);
        
        horaActual=new JTextField();
        horaActual.setBounds(100,20,101,20);
        this.add(horaActual);
        
        ponerAlarmaLabel=new JLabel("Pon hora de alarma:");
        ponerAlarmaLabel.setBounds(40,50,120,40);
        this.add(ponerAlarmaLabel);
        
        horaAlarma=new JTextField();
        horaAlarma.setBounds(10,100,50,40);
        this.add(horaAlarma);
        
        h=new JLabel("H");
        h.setBounds(30,150,20,10);
        this.add(h);
        
        minAlarma=new JTextField();
        minAlarma.setBounds(75,100,50,40);
        this.add(minAlarma);
        
        m=new JLabel("M");
        m.setBounds(95,150,20,10);
        this.add(m);
        
        segAlarma=new JTextField();
        segAlarma.setBounds(140,100,50,40);
        this.add(segAlarma);
        
        s=new JLabel("S");
        s.setBounds(155,150,20,10);
        this.add(s);
        
        botonActivar=new JButton("Activar");
        botonActivar.setBounds(10,200,100,40);
        botonActivar.addActionListener(this);
        this.add(botonActivar);
        
        
        botonAnular=new JButton("Desactivar");
        botonAnular.setBounds(140,200,100,40);
        botonAnular.addActionListener(this);
        this.add(botonAnular); 
        rel = new Reloj();
        tm=new Timer();
        tm.schedule(rel,0,1000);
    }
    
    public void actionPerformed(ActionEvent e){
        if(e.getSource()==botonActivar){
            System.out.println("Alarma activada");
            
            setHora();
        }
        if(e.getSource()==botonAnular){
            System.out.println("Alarma anulada");
        }
    }
    
    public void setHora(){
        horasAlarma=Integer.parseInt(horaAlarma.getText());
        minutoAlarma=Integer.parseInt(minAlarma.getText());
        segundoAlarma=Integer.parseInt(segAlarma.getText());
        if(Calendar.HOUR_OF_DAY==horasAlarma && Calendar.MINUTE==minutoAlarma && Calendar.SECOND == segundoAlarma){
            JOptionPane aviso=new JOptionPane("Alarma!");
        }
        
        
    }
    public class Reloj extends TimerTask{
        @Override
    public void run(){
       
        String s;
        Calendar cal=Calendar.getInstance();
        int hora =cal.get(Calendar.HOUR_OF_DAY);
        int min = cal.get(Calendar.MINUTE);
        int seg = cal.get(Calendar.SECOND);
        s=hora+":"+min+":"+seg;
        horaActual.setText(s);
        horaActual.setEnabled(false);
        System.out.println("Escribo");
    }
}
    
}

Y la clase RelojAlarma:

package relojalarma;
import javax.swing.JFrame;


public class RelojAlarma {

    public static void main(String[] args) {
        JFrame app=new JFrame();
        
        Panel pa=new Panel();
        app.setSize(300,300);
        app.setTitle("Alarma MegaGuay");
        app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        app.add(pa);
        app.setVisible(true);
        
    }
}

Además en el método run al obtener la hora no lo haces correctamente (fíjate como lo he puesto).

Espero que te ayude y lo acabes.

+1
0
-1
Imagen de danirolo7
+1
0
-1

Muchísimas gracias :3. Ahora tengo todo bastante más claro y solucionado, ya está terminado el trabajo y subido en los servidores de la uni y actualizado en Git por si a alguien le sirve alguna vez (que lo dudo xD), además de implementar la función de snooze...creo que si me aburro le haré algo para que reproduzca un sonido o algo así, pero ya tendría que investigar para ello.

De nuevo gracias, un saludo!

+1
0
-1

----------------------------------------------------
Sin malos rollos.

http://fausto23.wordpress.com

Linux User #476658
Ubuntu User#23611

¡¡¡Salud y Libertad!!!

Imagen de danirolo7
+1
0
-1

Actualizado en GitHub con sonido de alarma :)

ttps://danirolo7@github.com/danirolo7/RelojAlarma.git

+1
0
-1

----------------------------------------------------
Sin malos rollos.

http://fausto23.wordpress.com

Linux User #476658
Ubuntu User#23611

¡¡¡Salud y Libertad!!!

Imagen de danirolo7
+1
0
-1

+1
0
-1

----------------------------------------------------
Sin malos rollos.

http://fausto23.wordpress.com

Linux User #476658
Ubuntu User#23611

¡¡¡Salud y Libertad!!!