jueves, 9 de mayo de 2019

Creacion de alarma en Java Parte 2

En continuidad con lo anterior, veremos la creación de las operaciones en la cual aremos el seteo de las horas, minutos y segundos  junto con la fecha...

En este código lo que are sera en primera instancia el get de la hora del sistema para setear el label de la vista.

El código queda así.
---
public class Operations implements Runnable{
 Principal p;

 public Operations( Principal p ){
  this.p = p;
 }

 public void getHora(){
  run();
 }

 @Override
 public void run(){
   Calendar calen = Calendar.getInstance();
        long lastTime = System.nanoTime();
        double unprocessed = 0;
        double nsPerTick = 1000000000.0/60;
        int frames = 0;
        int ticks = 0;
        long lastTimer1 = System.currentTimeMillis();
        while( true ){
            long now = System.nanoTime();
            unprocessed += ( now - lastTime) / nsPerTick;
            lastTime = now;
            boolean shouldRender = true;
            while( unprocessed >= 1 ){
                ticks ++;
                unprocessed -= 1;
                shouldRender = true;
            }
            try{
                Thread.sleep( 2 );
            }catch( InterruptedException e ){
                System.err.println( e.getMessage() );
            }
            if( shouldRender ){
                frames ++;
                calen = Calendar.getInstance();
                p.lblReloj.setText( fechaActual(calen) );
    /*+ ":" +  calen.get(Calendar.MILLISECOND)*/
            }
            if( System.currentTimeMillis() - lastTimer1 > 1000 ){
                System.out.println( "Frames & ticks [ " + frames + "," + ticks + "]");
                lastTimer1 += 1000;
                frames = 0;
                ticks = 0;
            }
        }
 }
    public String fechaActual(Calendar calen ){
        String dia =  calen.get( Calendar.DAY_OF_MONTH ) +""; dia = ( Integer.parseInt( dia ) < 10 )? "0" + dia: dia;
        String mes =  calen.get( Calendar.MONTH ) +""; mes = ( Integer.parseInt( mes ) < 10 )? "0" + mes: mes;
        int hora_ = calen.get(Calendar.HOUR_OF_DAY );
        int minuto_ = calen.get( Calendar.MINUTE );
        int segundo_ = calen.get( Calendar.SECOND );
        String fecha = dias(calen.get( Calendar.DAY_OF_WEEK) ) + " " + 
            dia + " de " + 
            mesAn( Integer.parseInt( mes ) ) + " del " + 
            calen.get( Calendar.YEAR ) + " " +
            hora_ + ":" + minuto_+":" + segundo_ ;

        if( p.chkActive.isSelected() ){
            if( p._hora > -1 && p._minuto > -1 && p._segundo > -1 ){
                if ((hora_ == p._hora) && (minuto_ == p._minuto) && (segundo_ == p._segundo)) {
                    if (!p.estaSonando) {
                        new SoundClipTest();
                    }
                    p.estaSonando = true;
                }
            }
        }
        return fecha;
    }
    public String dias(int dia ){
        String[] semana = { "Lunes", "Martes", "Miercoles", "Jueves", "Viernes", "Sabado", "Domingo" };
        return semana[ dia ];
    }
    public String mesAn( int mes ){
        String[] mesAnio = { "Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre" };
        return mesAnio[ mes ];
    }
    class SoundClipTest extends JFrame implements ActionListener{
        JButton btnPause = new JButton("Pause");
        public SoundClipTest() {
                this.setTitle("Test Sound Clip");
                this.setSize(300, 200);
                this.setVisible(true);
                this.setLayout(null);
                
                btnPause.setBounds(5,5,100,25);
                btnPause.setActionCommand("pause");
                btnPause.addActionListener(this);
                this.add(btnPause);
                play();
        }
        public void play(){
            reproduce();
        }
        AudioClip s;
        public void reproduce(){
            
            try {
                File f = new File("a1.wav");
                if (f.exists()) {
                    System.out.println("validando que el archivo exista");
                }
                URL url = f.toURL();
                s = Applet.newAudioClip(url);
                s.play();
            } catch (MalformedURLException ex) {
                Logger.getLogger(Operations.class.getName()).log(Level.SEVERE, null, ex);
            }
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            if( "pause".equals(e.getActionCommand())){
                s.stop();
                btnPause.setActionCommand( "play");
                btnPause.setText("Play");
            }
            if( "play".equals(e.getActionCommand())){
                s.play();
                btnPause.setActionCommand( "pause");
                btnPause.setText("Pause");
            }
            
        }
    }

}
---
Explicaciones...
Principal p;

 public Operations( Principal p ){
  this.p = p;
 }
Es necesario hacer una instancia de la clase principal, para poder acceder a sus
propiedaddes y sus elementos.
 public void getHora(){
  run();
 }

El método getHora() inicia el thread que estará seteando la hora cada segundo.


 @Override
 public void run(){
   Calendar calen = Calendar.getInstance();
        long lastTime = System.nanoTime();
        double unprocessed = 0;
        double nsPerTick = 1000000000.0/60;
        int frames = 0;
        int ticks = 0;
        long lastTimer1 = System.currentTimeMillis();
        while( true ){
            long now = System.nanoTime();
            unprocessed += ( now - lastTime) / nsPerTick;
            lastTime = now;
            boolean shouldRender = true;
            while( unprocessed >= 1 ){
                ticks ++;
                unprocessed -= 1;
                shouldRender = true;
            }
            try{
                Thread.sleep( 2 );
            }catch( InterruptedException e ){
                System.err.println( e.getMessage() );
            }
            if( shouldRender ){
                frames ++;
                calen = Calendar.getInstance();
                p.lblReloj.setText( fechaActual(calen) );
    /*+ ":" +  calen.get(Calendar.MILLISECOND)*/
            }
            if( System.currentTimeMillis() - lastTimer1 > 1000 ){
                System.out.println( "Frames & ticks [ " + frames + "," + ticks + "]");
                lastTimer1 += 1000;
                frames = 0;
                ticks = 0;
            }
        }
 }

El método run() se encarga de construir el thread y reproducirlo cada determinado tiempo...
para ello se ocupa el nanotiempo del sistema mostrando frames y ticks cada segundo.


Nota: Este método lo tengo agregado en un proyecto diferente ( un juego ) es por ello
que tiene las variables de frames y ticks.



    public String fechaActual(Calendar calen ){
        String dia =  calen.get( Calendar.DAY_OF_MONTH ) +""; dia = ( Integer.parseInt( dia ) < 10 )? "0" + dia: dia;
        String mes =  calen.get( Calendar.MONTH ) +""; mes = ( Integer.parseInt( mes ) < 10 )? "0" + mes: mes;
        int hora_ = calen.get(Calendar.HOUR_OF_DAY );
        int minuto_ = calen.get( Calendar.MINUTE );
        int segundo_ = calen.get( Calendar.SECOND );
        String fecha = dias(calen.get( Calendar.DAY_OF_WEEK) ) + " " + 
            dia + " de " + 
            mesAn( Integer.parseInt( mes ) ) + " del " + 
            calen.get( Calendar.YEAR ) + " " +
            hora_ + ":" + minuto_+":" + segundo_ ;

        if( p.chkActive.isSelected() ){
            if( p._hora > -1 && p._minuto > -1 && p._segundo > -1 ){
                if( ( hora_ == p._hora ) && (minuto_ == p._minuto) && (segundo_ == p._segundo) ){
                    System.out.println( "esta sonando" );
                    p.estaSonando = !true;
                }
            }
        }
        return fecha;
    }
El metodo fechaActual( calendar calen ) se encarga de extraer lo necesario para crear
el string que se mostrara en el label del reloj.

Nota: Por el momento es un string seteado manualmente mas adelante lo que are sera agregar un date Format



    public String dias(int dia ){
        String[] semana = { "Lunes", "Martes", "Miercoles", "Jueves", "Viernes", "Sabado", "Domingo" };
        return semana[ dia ];
    }
    public String mesAn( int mes ){
        String[] mesAnio = { "Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre" };
        return mesAnio[ mes ];
    }

Por ultimo los metodos dias y mesAn se encargan de cambiar el dia y el mes de un entero a un string con su respectiva descripción...



Con esto finalizamos la clase Operations...

No te olvides de dejar tu comentario y seguirme para que de esta manera puedas recibir mis próximas publicaciones.


Hasta la próxima.

No hay comentarios:

Publicar un comentario