Este excelente contador com retorno funciona,
em ordem crescente, diferente do outro
apresentado por mim mesmo há algum tempo atrás.
Foi criado com os poderosos recursos da
biblioteca javaFx, sua excelência excede
soberbamente a biblioteca swing, alíás
penso comigo que é perca de tempo estudar
janelas gráficas em swing se temos a javaFx
que faz tudo e muito mais com tantos avanços
e superioridade em relação a sua concorrente.
A janela possui uma bela Moldura criada em canvas,
e isto é uma marca minha, quase cem por cento de meus
programas desde os tempos do C no dos, ou com gráficos
usando graphics.h, sempre criei Molduras em volta
da janela.
Temos ainda um menu no estilo profissional com duas opções,
sendo uma para saída do programa e a outra para informação
sobre o autor que sou eu mesmo, e chamada de dois botões.
Quando a opção Inf do menu é acionada, ele chama dois botões,
Um é o botão Inf que mostra meu nome, e o outro é o botão
"cls", que apaga estas mensagens deixando a interface limpa.
Se você gosta de animação em javaFx comece agora mesmo
testando este programa.
Veja abaixo uma imagem do programa em execução:
Veja abaixo o código do programa:
em ordem crescente, diferente do outro
apresentado por mim mesmo há algum tempo atrás.
Foi criado com os poderosos recursos da
biblioteca javaFx, sua excelência excede
soberbamente a biblioteca swing, alíás
penso comigo que é perca de tempo estudar
janelas gráficas em swing se temos a javaFx
que faz tudo e muito mais com tantos avanços
e superioridade em relação a sua concorrente.
A janela possui uma bela Moldura criada em canvas,
e isto é uma marca minha, quase cem por cento de meus
programas desde os tempos do C no dos, ou com gráficos
usando graphics.h, sempre criei Molduras em volta
da janela.
Temos ainda um menu no estilo profissional com duas opções,
sendo uma para saída do programa e a outra para informação
sobre o autor que sou eu mesmo, e chamada de dois botões.
Quando a opção Inf do menu é acionada, ele chama dois botões,
Um é o botão Inf que mostra meu nome, e o outro é o botão
"cls", que apaga estas mensagens deixando a interface limpa.
Se você gosta de animação em javaFx comece agora mesmo
testando este programa.
Veja abaixo uma imagem do programa em execução:
Veja abaixo o código do programa:
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.stage.Stage;
import javafx.animation.KeyFrame;
import javafx.animation.KeyValue;
import javafx.animation.Timeline;
import javafx.beans.property.IntegerProperty;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.event.EventHandler;
import javafx.scene.paint.Color;
import javafx.util.Duration;
import javafx.scene.control.Menu;
import javafx.scene.control.MenuBar;
import javafx.scene.control.MenuItem;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.Pane;
import javafx.scene.text.Font;
import javafx.scene.text.FontWeight;
import javafx.geometry.Insets;
import javafx.concurrent.Task;
import javafx.animation.*;
/////////////////////////////////////////////////////////////////////////////
public class PROJETO extends Application {
private static Timeline videoTick;
static int k = 0;
public static boolean running = false;
static int cont = 0;
private static Timeline tim_line;
private static Label ti_mer = new Label ( );
static Canvas canvas = new Canvas ( 490, 310 );
static GraphicsContext ctx = canvas.getGraphicsContext2D ( );
static String str_1 = "MUITO OBRIGADO";
static String str_3 = "Por: Samuel Lima";
static BorderPane borderPane = new BorderPane ( );
static Pane ro_ot = new Pane ( );
static Scene sce_ne = new Scene ( ro_ot, 490, 310 );
static MenuBar menuBar = new MenuBar ( );
//
///////////////////////////////////////////////////////////////////
public static Node But_ton_1 ( ) {
Button btn_1 = new Button ( "Inf" );
btn_1.setPrefWidth ( 50 );// Largura do botão
btn_1.setLayoutX ( 22 );// Posição do botão
btn_1.setPrefHeight ( 20 );// altura do botão
btn_1.setLayoutY ( 262 );// //Posição do botão
btn_1.setOnAction ( new EventHandler < ActionEvent > ( ) {
@Override
public void handle ( ActionEvent event ) {
int b = 0;
b = 1;
Sleep ( 1800, b );
b = 2;
Sleep ( 2800, b );
}
} );
ro_ot.getChildren ( ).add ( btn_1 );
return btn_1;
}
//
///////////////////////////////////////////////////////////////////
public static Node But_ton_2 ( ) {
Button btn_2 = new Button ( "Cls" );
btn_2.setPrefWidth ( 50 );// Largura do botão
btn_2.setLayoutX ( 417 );// Posição do botão
btn_2.setPrefHeight ( 20 );// altura do botão
btn_2.setLayoutY ( 262 );// //Posição do botão
btn_2.setOnAction ( new EventHandler < ActionEvent > ( ) {
@Override
public void handle ( ActionEvent event ) {
// Coluna, linha,
comprimento, altura
// Apagando uma linha
ou partes
ctx.clearRect ( 80, 60, 180, 80 );
}
} );
ro_ot.getChildren ( ).add ( btn_2 );
return btn_2;
}
//
///////////////////////////////////////////////////////////////////
// Chamando uma função depois de um certo
tempo
public static void Tempo_2 ( ) {
ctx.setFill ( Color.GREEN );
ctx.fillText ( "MUITO
OBRIGADO", 80, 120 );
}
public static void Tempo_1 ( ) {
ctx.setFill ( Color.BLUE );
ctx.fillText ( "Por: Samuel
Lima", 80, 90 );
}
public static int Sleep ( int x, int k ) {
Task < Integer > close = new Task < Integer > ( ) {
@Override
protected Integer call ( ) throws Exception {
Thread.sleep ( x );
return null;
}
};
close.setOnSucceeded ( c -> {
if ( k == 1 )
Tempo_1 ( );
if ( k == 2 )
Tempo_2 ( );
} );
new Thread ( close ).start ( );
return 0;
}
//
/////////////////////////////////////////////////////////////////
public static int Menu_Bar ( ) {
EventHandler < ActionEvent > action = changeTabPlacement ( );
Menu menu = new Menu ( "Arq" );
MenuItem top = new MenuItem ( "Exit" );
top.setOnAction ( action );
menu.getItems ( ).add ( top );
MenuItem bottom = new MenuItem ( "Inf" );
bottom.setOnAction ( action );
menu.getItems ( ).add ( bottom );
menuBar.getMenus ( ).add ( menu );
borderPane.setTop ( menuBar );
return 0;
}
//
/////////////////////////////////////////////////////////////////
private static EventHandler < ActionEvent > changeTabPlacement ( ) {
return new EventHandler < ActionEvent > ( ) {
public void handle ( ActionEvent event ) {
MenuItem mItem = ( MenuItem ) event.getSource ( );
String side = mItem.getText ( );
if ( "Exit".equalsIgnoreCase ( side ) ) {
System.exit ( 0 );
} else if ( "Inf".equalsIgnoreCase ( side ) ) {
But_ton_1 ( );
But_ton_2 ( );
}
}
};
}
//
//////////////////////////////////////////////////////////////////////////
public static void Sleep_1 ( int ini_cont ) {
IntegerProperty tim_seg = new
SimpleIntegerProperty ( ini_cont );
ti_mer.setPrefWidth ( 90 );// Largura do
timerLabel
ti_mer.setLayoutX ( 200 );// Posição do
timerLabel coluna
ti_mer.setPrefHeight ( 40 );// altura do
timerLabel
ti_mer.setLayoutY ( 185 );// //Posição do
timerLabel linha
// Sincronizando as propriedades de texto
timerLabel e timeSeconds
ti_mer.textProperty ( ).bind ( tim_seg.asString ( ) );
ti_mer.setTextFill ( Color.RED );
// Faz ajustes finos no timerLabel
ti_mer.setStyle ( "-fx-font-size:
4em;" + "-fx-padding: 10;"
+ "-fx-border-style:
solid inside;" + "-fx-border-width: 3;"
+ "-fx-border-insets:
5;" + "-fx-border-radius: 5;"
+ "-fx-border-color:
blue;" );
tim_seg.set ( ini_cont );
tim_line = new Timeline ( );
tim_line.getKeyFrames ( ).add (
// A duração sempre será de 60 segundos
new KeyFrame ( Duration.seconds ( 60 ),
// Para torná-lo
decrescente coloque 0 no tim_seg
// Para torná-lo
crescente coloque 60 no tim_seg
new KeyValue ( tim_seg, 60 ) ) );
tim_line.playFromStart ( );
}
//
///////////////////////////////////////////////////////////////////////////
//Função usada como clock criada por mim
public static int Sleep ( int x ) {
while ( k < 60 ) {
Duration duration = Duration.millis ( x );
videoTick = new Timeline ( new KeyFrame ( duration,
new EventHandler < ActionEvent > ( ) {
public void handle ( ActionEvent actionEvent ) {
k++;
Sleep_1 ( k );
System.out.println ( k );
if ( k == 59 ) {
k = -1;
}
}
} ) );
break;
}
videoTick.setCycleCount ( Animation.INDEFINITE );
videoTick.playFromStart ( );
return k;
}
//
//////////////////////////////////////////////////////////////////////////
public void start ( Stage stage ) {
stage.setTitle ( "CONTADOR
CRESCENTE EM JAVAFX" );
// Dando uns efeitos na moldura
ro_ot.setStyle ( "-fx-padding:
5;" + "-fx-border-style: solid inside;"
+ "-fx-border-width:
18;" + "-fx-border-insets: 5;"
+ "-fx-border-radius:
5;" + "-fx-border-color: blue;" );
Menu_Bar ( );
// Configurando o local exato do menu
borderPane.setPadding ( new Insets ( 23, 500, 0, 23 ) );
ctx.setFont ( Font.font ( "Tahoma", FontWeight.NORMAL, 20 ) );
ctx.setFill ( Color.RED );
ctx.fillText ( "CONTADOR
CRESCENTE EM JAVAFX", 80, 60 );
Sleep ( 1000 );
// Para torná-lo decrescente coloque 60 no
sleep
// Para torná-lo crescente coloque 0 no sleep
Sleep_1 ( 0 );// Inicial o contador
ro_ot.getChildren ( ).addAll ( canvas, borderPane, ti_mer );
stage.setScene ( sce_ne );
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.