terça-feira, 4 de setembro de 2018

JavaFX - contador infinito ascendente e descendente

Para criação de jogos, cronômetros,
relógios digitais, temporizadores,
ou qualquer programa onde se necessite
de um contador digital, apresento-lhes
este excelente contador ascendente e descendente
infinito e com retorno.
Este ótimo programa ainda conta com um botão
de duas funções, programado para pausar e continuar
o contador em pleno funcionamento, modificando 

a cor do botão, dando a idéia de um botão apagado,
possui ainda, um placar digital colocado no canto
superior direito para indicar uma volta completa,
com isto, a cada subida e descida ele marca no placar
o número dos ciclos feitos, e isto segue infinitamente, 
salvo se o usuário fechar o programa.
Bons programadores de java, e que já possuem bons
conhecimentos em JavaFX, tem plena liberdade de
fazerem modificações neste projeto a fim de que
se enquadre as suas pretensões, mas não se esqueçam
dos créditos ao autor do projeto que sou eu mesmo.


  Veja abaixo uma imagem do programa em execução:


Veja abaixo um vídeo com o programa funcionando:


Veja abaixo o código do programa:


import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.stage.Stage;
import javafx.scene.paint.Color;
import javafx.scene.layout.Pane;
import javafx.scene.shape.Circle;
import javafx.scene.text.Font;
import javafx.scene.text.FontPosture;
import javafx.scene.text.FontWeight;
import javafx.scene.text.Text;
import javafx.event.ActionEvent;
import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.event.EventHandler;
import javafx.util.Duration;
import javafx.animation.*;
import javafx.scene.input.MouseEvent;

public class PROJETO extends Application {
     private Timeline videoTick;
      int i = 0, k = 0, l = 1, load     = 1000;
      Boolean y           = false;
      Canvas canvas       = new Canvas ( 620, 350 );
      GraphicsContext ctx = canvas.getGraphicsContext2D ( );
      Pane root           = new Pane ( );
      Scene scene         = new Scene ( root, 620, 350,Color.BLACK );
      Text t_2            = new Text ( );
      Text t_3            = new Text ( );
      Circle btn_1 = new Circle ( 150, 300, 20 );
////////////////////////////////////////////////////////////////////////////
     public void Informe ( ) {
         t_2.setX ( 200 );
         t_2.setY ( 290 );
         t_2.setFill ( Color.WHITE );
         t_2.setText ( "Por: Samuel Lima\n"
                   + "sa_sp10@hotmail.com\n"
                   +"\t\tMUITO OBRIGADO");    
         //Colocando efeito na fonte com css
         t_2.setStyle ( "-fx-font-style: italic;"
                   + "-fx-font-size: 15px;"
                   + "-fx-font-weight: bold;"
                   + " -fx-effect: innershadow( three-pass-box ,"
                   + " rgba(0,0,0,0.7) , 6, 0.0 , 0 , 4 );");
     }
    // /////////////////////////////////////////////////////////////////////////
   public void button_person_1 ( ) {
       EventHandler < MouseEvent > eventHandler_1 =
                 new EventHandler < MouseEvent > ( ) {
            @Override
            public void handle ( MouseEvent e ) {
                 if ( i == 0 ) {
                    videoTick.pause ( );
                      System.out.println ( "Pausado" );
                      btn_1.setFill ( Color.rgb ( 29, 111, 0 ) );
                      i++;
                 } else {            
                    videoTick.play ( );
                      System.out.println ( "Ligado" );
                      btn_1.setFill ( Color.rgb ( 0, 255, 0 ) );
                      i = 0;
                 }           
            }
       };
       btn_1.setFill ( Color.rgb ( 0, 255, 0 ) );
       btn_1.addEventFilter ( MouseEvent.MOUSE_CLICKED, eventHandler_1 );
   }
     // /////////////////////////////////////////////////////////////////////////
     //Método usado como clock criado por mim
     public int Sleep ( int x ) {
         Duration duration = Duration.millis ( x );
         videoTick = new Timeline ( new KeyFrame ( duration,
                   new EventHandler < ActionEvent > ( ) {
              public void handle ( ActionEvent actionEvent ) {
                        //Usando fonte em italic
                        ctx.setFont ( Font.font ( "alarm clock", FontWeight.NORMAL, 150 ) );
                   //Coluna, linha, comprimento, altura
                   ctx.clearRect (  50, 70, 1000, 300 );    
                   if ( k < 10 ) {
                        ctx.setStroke ( Color.LIME );
                        ctx.setLineWidth ( 4.0 );
                        ctx.setFill ( Color.LIME );
                        ctx.fillText (   "0", 270, 230 );
                        ctx.strokeText (  "0", 270, 230 );
                        ctx.setStroke ( Color.LIME );
                        ctx.setLineWidth ( 4.0 );
                        ctx.setFill ( Color.LIME );
                        ctx.fillText (  " " + k, 270, 230 );
                        ctx.strokeText ( " " + k, 270, 230 );
                   } if ( k > 9 ) {
                        ctx.setStroke ( Color.LIME );
                        ctx.setLineWidth ( 4.0 );
                        ctx.setFill ( Color.LIME );
                        ctx.fillText (  " " + k, 180, 230 );
                        ctx.strokeText ( " " + k, 180, 230 );
                   } if ( k >= 0 && y == false ) {
                        k++;
                   } if ( y == true ) {
                        k--;
                        if ( k == 0 ) {
                            y = false;
                            l++;
                        }
                   } if ( y == false && k == 21 ) {
                        k = 19;
                        y = true;
                   } if ( y == true ) {
                   t_3.setFont ( Font.font ( "alarm clock", FontWeight.NORMAL, 50 ) );
                   t_3.setX ( 480 );
                   t_3.setY ( 100 );
                   t_3.setFill ( Color.RED );
                   t_3.setText ( " " + l );
                   }
              }
         } ) );
         videoTick.setCycleCount ( Animation.INDEFINITE );
         videoTick.playFromStart ( );
         return k;
     }
     // /////////////////////////////////////////////////////////////////////////
     public void start ( Stage stage ) {
         stage.setTitle ( "JAVAFX - CONTADOR ASCENDENTE E DESCENDENTE" );
         //Usando fonte em italic
         ctx.setFont ( Font.font ( "Helvetica", FontWeight.BOLD,
                   FontPosture.ITALIC, 22 ) );
         //Criando moldura em css
         root.setStyle ( "-fx-padding: 5;"
                   + "-fx-border-style: solid inside;"
                   + "-fx-border-width: 10;"
                   + "-fx-border-insets: 5;"
                   + "-fx-border-radius: 5;"
                   + "-fx-border-color: yellow;");
         ctx.setFill ( Color.RED );
         ctx.fillText ( "JAVAFX - CONTADOR ASCENDENTE E DESCENDENTE", 36, 50 );
         button_person_1 ( );
         Sleep ( load );
         Informe ( );
         root.getChildren ( ).addAll ( canvas, t_2, t_3, btn_1 );
         stage.setScene ( scene );
         stage.show ( );
     }
     // /////////////////////////////////////////////////////////////////////////
     public static void main ( String [ ] args ) {
         Application.launch ( args );
     }
}

Nenhum comentário:

Postar um comentário

Observação: somente um membro deste blog pode postar um comentário.