Un ejercicio banal para este viernes

Por si están aburridos el día de hoy intenten ( más bien hagan ) el siguiente programa en swing.

import java.util.Timer;
import java.util.TimerTask;
import static java.lang.System.out;

class TimeTime {
    public static void main( String ... args )  {

        int a = Integer.parseInt( args[0] );
        int b = Integer.parseInt( args[1] );

        final Timer timer = new Timer();

        timer.scheduleAtFixedRate( new PrintBeat( ". " ) , 0, 1000 );
        timer.scheduleAtFixedRate( new PrintBeat( String.format("%c", 7 ) ) , b*1000, ( a + b ) * 1000 );
        timer.scheduleAtFixedRate( new PrintBeat( String.format("%c%n", 7 ) ) , b*2000, ( a + b ) * 1000 );

        timer.schedule( new TimerTask() {
            public void run() {
                timer.cancel();
                out.println("FIN");
            }
        },  4*60*1000);

    }
}
class PrintBeat extends TimerTask {
    private final String beat;
    PrintBeat( String beat ) {
        this.beat = beat;
    }
    public void run() {
        out.print( beat );
    }
}

Donde está la dificultad ( además de que sea en swing :P )?
1) No debe de ser una traducción "literal" es decir, no hay que poner mucha atención al código sino en lo que hace ( sus efectos pues ).
2) Una vez entendido lo que debe de hacer, hacerlo mucho más bonito.

:)

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de ezamudio

está bien?

Seguro que no hay por ahí algún bug? No entendí muy bien... si le paso parms 1 1, primero imprime 3 puntos y luego puras lineas de a 2 puntos.

Si le paso 5 1, primero 3 puntos y luego puras lineas de 6 puntos.

Con 1 2 primero 5 puntos y luego lineas de 3 puntos.

Si en vez de "a" y "b" tuvieran un nombre descriptivo...

Imagen de ezamudio

a ver...

imprime un punto cada segundo. Aparte, da un campanazo a los B segundos y repite cada A+B segundos. Y aparte, otro campanazo y cambio de linea a los B*2 segundos y repetirlo cada A+B segundos...

Imagen de ezamudio

Groovy SwingBuilder

Usando el SwingBuilder de Groovy está muy fácil. Tanto, que hasta hice el código para que pueda seguir funcionando en texto y aparte en Swing.

El PrintBeat acepta un closure para imprimir (que vamos a usar también con otros propósitos):

class PrintBeat extends TimerTask {
  private final String beat
  private final def out
  PrintBeat( String beat, printer ) {
    this.beat = beat
    out = printer
  }
  public void run() {
    out(beat)
  }
}

y hay una función (bueno un closure realmente, porque todo lo puse en un vil script), que echa a andar el timer con los parámetros que le indiques (aquí uso tres closures distintos):

def setup = { Timer t, int a, int b, def out, def bell, def bellAndNewline ->
  t.scheduleAtFixedRate( new PrintBeat(". ", out) , 0, 1000 );
  t.scheduleAtFixedRate( new PrintBeat( 'x', bell) , b*1000, ( a + b ) * 1000 )
  t.scheduleAtFixedRate( new PrintBeat( 'x', bellAndNewline) , b*2000, ( a + b ) * 1000 )
  t.schedule( {
    t.cancel()
    out("FIN")
  } as TimerTask,  4*60*1000)
}

Para que siga corriendo exactamente igual que tu programa original, nomás hay que correr esto:

int a = args[0] as int
int b = args[1] as int
final Timer timer = new Timer()
setup(timer, a, b, { print it }, { print String.format('%c', 7 ) }, { println String.format('%c', 7 ) })

Ahora... para que todo esto jale en Swing:

import java.awt.Toolkit
new SwingBuilder().edt {
  frame(title:'Banalidades', size:[400,400], show:true) {
    def stimer //aquí tendremos un timer
    def out //aquí tendremos área de texto
    vbox {
      hbox {
        label('P1:')
        tf1 = textField('1')
        label('P2:')
        tf2 = textField('1') //estos son los campos con los parámetros
        button(text:'Iniciar', actionPerformed:{ //Acción invocada al oprimir este botón
          stimer?.cancel() //cancelar timer anterior
          stimer = new Timer() //crear uno nuevo
          out.text='' //borrar texto
          setup(stimer, tf1.text as int, tf2.text as int,
            { out.append(it) }, //closure para imprimir, agrega texto al área
            { Toolkit.defaultToolkit.beep() }, //closure para campanazo
            { Toolkit.defaultToolkit.beep(); out.append('\n') }) //closure para campanazo y newline
        })
      }
      out = textArea(rows:40, columns:40, editable:false)
    }
  }
}

Digamos que el código es lo

Digamos que el código es lo de menos. Lo que hay que hacer "en swing" es lo que hace el programa.

mmhhh Si tiene un ligerísimo bug, pero como lo hice hoy en la mañana ya no me dí tiempo de corregirlo ( pensé que lo iba a a hacer en 10 mins y cuando ya llevaba 15 dije, ahi muere ).

Digamos que si le pasas 15 - 5 debería de ser

............... Beep
.... Beep
............... Beep
.... Beep

Pero la verdad es que no me quedó así :P

De nuevo, el código es lo de menos.

Imagen de pavul

alguien me explica los ARGS

la funcion void main acepta un parametro de arreglo 'String args[]'

pero no se para que se usan o como se usan,

tiene que ver al momento de correr el programa que escriban el parametro.

por ejemplo en la linea de comando

../../programa.java argumento

asi se pasan los argumentos?

o estoy en un error?

Exactamente son para eso. A

Exactamente son para eso.

A un programa en Java ( y básicamente a cualquier programa de computadora ) se le pueden pasar argumentos en su invocacion. La lista de argumentos, esta en el método main definida así:

public static void main( String ... args )  {
 …
}

Y en efecto, al ejecutarlo quedará así:

java TimeTime 15 5

a será 15
y b será 5 como lo estabas pensando.

Imagen de ezamudio

PHB-itis?

Te pusieron de jefe o algo así Oscar? Te estás convirtiendo en un PHB? O es nomás porque es viernes? Primero pones un programa, no dices qué debe hacer, solamente pones el código, y luego dices Digamos que el código es lo de menos, sólo hacer lo que el programa hace... y luego admites que el código que pusiste no hace lo que querías que hiciera.

Nomás te faltó pedirlo en 3 líneas de código y para ayer...

Jajajajaj Asume en todas mis

Asume en todas mis comunicaciones que antecedo un "Por favor" y que termino con un "gracias".

:-S Que terrible proyección la mía, no me había dado cuenta :D , pero tienes razón :-O Me estoy convirtiendo en USUAAARIOOOOO naaaaahhhhhhhh.

Lo que tu no sabes es que con una macro de excel ya me funciona :-S :-S

El origen del programa es bastante obscuro y tiene que ver ... mmmhhh naaah mejor mañana.

Por cierto ¿Cuanto te falta para terminarlo? jajajajajaja

</sarcasm>

Imagen de ezamudio

ya está

Ahi esta madre ya jalando, no hubiera posteado código teórico en un caso así. Pero mi comentario anterior no es por la falta de modales o lo que sea (mta falta que yo me ponga nena con algo así pfffff) sino por las contradicciones de "aquí está un programa, no les voy a decir qué hace, por lo tanto es obvio que tienen que ver el código para saber qué hace, pero no se fijen en el código, es lo de menos; es lo único que hay, pero es lo de menos" WTF?

Imagen de rugi

*agrega esta conversación

*agrega esta conversación para analizarla despues con sus asesores *
XD

Jejej, lo bueno de concentrar distintos tipos de enfoques de solución es justamente, resolver problemas de nuevas y mejores maneras.

La parte no tan buena es que, dado que las palabras escritas no logran aun transmitir todo el mensaje, se escapan ciertos indicadores, cuya ausencia hacen que la retroalimentación del mensaje sea menor a la que sería de forma personal.

:)

Por otro lado, el por favor y gracias, creo nunca sobran..... nunca mejor dicho: el protocolo así lo marca.

Saludos a ambos.!!!

---

Razón de ser del programa.

jejejej ... no, para nada, jamás creí que te estuveras poniendo nena, y eso de "por favor y gracias" es broma y no es contra-nenés de mi parte eh, sino por aquello del PHB.

Así de: "Mandame tus reportes!" ( cuando debería de ser "Por favor mandame tus reportes. Gracias" )

O "Levanta el servidor" etc. ( Por favor levanta el servidor, gracias )

jajaa

Si de hecho esta muy ambigua la explicación, me salió sin querer un "misteeeerio del vieeeernes"...

Acá abajo está toda la explicación ( tan banal como el programa ), hay que seleccionar con el mouse para ver el texto.

Al leer cual es el objetivo del programa pierde todo el chiste, pero la idea es: "analizar el comportamiento y hacer el mismo comportamiento, en Swing o en una aplicción de escritorio"

Ahí va, no sin un poco de pena :") 

Resulta que recientemente me volví no fumador y hasta estoy haciendo ejercicio en la mañana y etc. etc. 

Encontré una rutina que requiere de un cronometro especial.  Creo que se llama reloj de lapsos o algo así, donde dices: "15 segundos seguidos de 5 de reposo y así". 

Eeentonces, hoy en la mañana dije "ahh rayos por que no tengo un reloj así para poder .. .. " y luego " un momento, eso se puede programar en 10 mins. 

Empecé con un while, luego con un Thread y terminé con este Timer/TimerTask. 

El programa es muy simple, recibe dos tiempos ( en segundos )  el primero es el tiempo tras el cual va a sonar la alarma y el segundo el tiempo de reposo, vuelve a sonar la alarma y así se sigue.  En realidad en estos relojes suena "beep, beep, beep". 


Pero claro, yo tenía que salir a trabajar y ya llevaba 15 minutos ( me estaba peleando con el formateador ) y dije pues ya.   Lo voy a postear a ver si a alguien le interesa. 

El chiste esta todo en no ver el código, sino en ver el comportamiento y luego hacer una aplicacion Swing de ella.

Imagen de rugi

Ah, sí.... *abre su IDE para

Ah, sí.... *abre su IDE para hacer el ejecicio* :P

Imagen de neko069

Tabata workout

De pura casualidad no estás haciendo la rutina llamada Tabata? los lapsos son de 20 segundos de repeticiones, 10 de descanso, 8 series.
Qué te crees que de hace rato vi tú código, y es muy parecido a algo que yo ando haciendo, sólo que en la mañana me traían en joda con ...C# :'-( ...
Bueno, el caso es que, igual complemento tú código con el mío para ver qué sale.
OffTopic. Si quieres un par de rolas de música para tu rutina, te las paso, son con los lapsos que te comento, e igual te paso algunos ejercicios que estaba haciendo.

Jejeje super... y .. .creo

Jejeje super... y .. .creo que si dicen de que se trata pierde el chiste la sobra que le puse ahí.

A cual código te refieres? Al que acabo de poner? Ahh pues comparte si, lo vemos.

Listo pues me despido

Chau!

Imagen de Sr. Negativo

Alarma ruidosa

Si que hace ruido esa alarma (o cronometro). En serio no lo intenten ejecutar con los audifonos puestos (con volumen al 100%) por favor , casi salgo volando de mi asiento (es en serio no es broma)

Algo asi puse, no recuerdo bien

java TimeTime  15 12 13 34

El programa no dejaba de correr (no se detuvo el ciclo tuve que reiniciar mi máquina) y eso si el ruido que hacia.

jaja Debiste poner una advertencia, estuvo bueno ( = para una broma ).

Ooops... quizá parecerá

Ooops... quizá parecerá petulante, pero es que en Mac nomás se oyen unos tamborcitos apagados: "tup, tup, tup" :P

Lo siento :P