quarta-feira, 28 de novembro de 2018

JavaFX - selecionando linhas em arquivo

Com este programa podemos ler quantidades
especificadas de linhas num arquivo,
Isto mesmo que você leu, é possível ler
apenas uma única linha do arquivo,
ou ele por completo.
A entrada de dados é feita num único textfield,
onde se alterna para o número inicial e final
escolhido pelo usuário.
Mas sua inteligencia não permite que o número final
seja menor que o inicial, enviando uma mensagem
para o usuário no próprio textarea que é usado
para imprimir as linhas selecionadas para leitura.
No menu de três opções escolhemos o que queremos fazer.
Na opção "Arquivo", o programa mostra o tamanho do arquivo
em bytes e o total de linhas que o mesmo possui.
Na opção "Leitura", inserimos um número para início e fim
para a quantidades de linhas que queremos ler,
e na opção "Sair" o programa é fechado rapidamente.

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



Veja abaixo um vídeo do programa em execução:


Veja abaixo o código do programa:


//JAVAFX - SELECIONANDO LINHAS EM ARQUIVO
//28/11/2018 - 20:54
import javafx.scene.Scene;
import javafx.scene.control.TextArea;
import javafx.stage.Stage;
import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.VBox;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import javafx.scene.layout.BorderPane;
import java.io.IOException;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.paint.Color;
import javafx.scene.control.Menu;
import javafx.scene.control.MenuBar;
import javafx.scene.control.MenuItem;
import javafx.scene.text.Font;
import javafx.scene.text.FontPosture;
import javafx.scene.text.FontWeight;
import javafx.scene.text.Text;
import javafx.scene.control.TextField;
import javafx.scene.control.TextFormatter;
import javafx.scene.control.TextFormatter.Change;
import javafx.scene.layout.HBox;
import java.util.function.UnaryOperator;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyEvent;
import java.awt.Toolkit;
import javafx.scene.input.KeyCodeCombination;
import javafx.scene.input.KeyCombination;

public class PROJETO extends Application {
     static TextField textField_1 = new TextField ( );
     static HBox hbox_1 = new HBox ( textField_1 );
     static TextArea text = new TextArea ( );
     static Text t_1 = new Text ( );
     static Text t_2 = new Text ( );
     static Text t_3 = new Text ( );
     static Text t_4 = new Text ( );
     static Text t_5 = new Text ( );
     static Text t_6 = new Text ( );
     static Text t_7 = new Text ( );
     static Text t_8 = new Text ( );
     static Canvas canvas = new Canvas ( );
     static GraphicsContext ctx = canvas.getGraphicsContext2D ( );
     static VBox vbox = new VBox ( );
     static GridPane grid = new GridPane ( );
     static BorderPane root = new BorderPane ( );
     static Scene scene = new Scene ( vbox, 600, 300 );
     static int a_1 = -1, qnt = 0;
     public static File file = new File ( "H:\\eclipse luna_two\\"
              + "PROJETO\\PROJETO\\src\\Harpa crista.txt" );
     static boolean x = false, existe = file.exists ( );
     static int [ ] vet = new int [ 100 ];
     static MenuBar menuBar = new MenuBar ( );
     static Menu arq = new Menu ( "Arq" );
     static MenuItem pesq = new MenuItem ( "Arquivo" );
     static MenuItem ler = new MenuItem ( "Leitura" );
     static MenuItem sair = new MenuItem ( "Sair" );   
/*========================================================================*/
     public static long inf_Arquivo ( ) throws IOException {
         int SIZE = 1;
         String [ ] str = new String [ SIZE ];
         long size = tamanho ( );
         BufferedReader f = new BufferedReader ( new FileReader ( file ) );
         int a = 0, i = 0;
         while ( ( str [ i ] = f.readLine ( ) ) != null ) {
              a++;
         }
         f.close ( );      
         text.appendText ( "" );
         text.clear ( );
         text.setVisible ( false );
         textField_1 .setVisible ( false );
         t_2.setVisible ( false );
         t_3.setVisible ( false );
         t_4.setVisible ( true );
         t_5.setVisible ( true );
         t_6.setVisible ( true );
         t_7.setVisible ( true );
         t_4.setFont ( Font.font ( "Helvetica", FontWeight.BOLD,
                   FontPosture.ITALIC, 16 ) );
         t_5.setFont ( Font.font ( "Helvetica", FontWeight.BOLD,
                   FontPosture.ITALIC, 16 ) );
         t_6.setFont ( Font.font ( "Helvetica", FontWeight.BOLD,
                   FontPosture.ITALIC, 16 ) );
         t_7.setFont ( Font.font ( "Helvetica", FontWeight.BOLD,
                   FontPosture.ITALIC, 16 ) );    
         t_4.setTranslateX ( 100 ); 
         t_4.setTranslateY ( -180 );         
         t_4.setFill ( Color.BLUE );
         t_4.setText ( "Tamanho do arquivo em bytes" );

         t_5.setTranslateX ( 360 ); 
         t_5.setTranslateY ( -203 );         
         t_5.setFill ( Color.RED );
         t_5.setText ( "" + size ); 

         t_6.setTranslateX ( 100 ); 
         t_6.setTranslateY ( -190 );              
         t_6.setFill ( Color.BLUE );
         t_6.setText ( "Total de linhas do arquivo" );     

         t_7.setTranslateX ( 340 ); 
         t_7.setTranslateY ( -213 );
         t_7.setFill ( Color.RED );
         t_7.setText ( "" + a );             
         vbox.getChildren ( ).addAll ( t_4, t_5, t_6, t_7 );
         return file.length ( );
     }
/*========================================================================*/
     private final static long tamanho ( ) throws IOException {
         return file.length ( );
     }
/*========================================================================*/
     public static void arqExist ( ) {
         if ( existe ) {
         } else {
              x = true;
              t_8.setFont ( Font.font ( "Helvetica", FontWeight.BOLD,
                        FontPosture.ITALIC, 16 ) );
              t_8.setTranslateX ( 140 ); 
              t_8.setTranslateY ( -213 );
              t_8.setFill ( Color.BLACK );
              t_8.setText ( "O arquivo não foi encontrado.");                                
         }        
     }
/*========================================================================*/
     public static void Menu ( ) {
         pesq.setOnAction ( new EventHandler < ActionEvent > ( ) {
              @Override
              public void handle ( ActionEvent e ) {
                   try {
                        text.appendText ( "" );
                        text.clear ( );
                        arqExist ( );
                       if ( x == false )
                        inf_Arquivo ( );
                   } catch ( IOException e1 ) {
                        // TODO Auto-generated catch block
                        e1.printStackTrace();
                   }
              }
         } );
         /*=====================================================*/
         ler.setOnAction ( new EventHandler < ActionEvent > ( ) {
              @Override
              public void handle ( ActionEvent e ) {
                   text.appendText ( "" );
                   text.clear ( );
                        arqExist ( );
                       if ( x == false )
                        textFieldArr ( );          
              }
         } );
         /*=====================================================*/
         sair.setOnAction ( new EventHandler < ActionEvent > ( ) {
              @Override
              public void handle ( ActionEvent e ) {
                   System.exit ( 0 );
              }
         } );
         /*=====================================================*/
         pesq.setAccelerator ( new KeyCodeCombination ( KeyCode.E,
                   KeyCombination.CONTROL_DOWN ) );
         ler.setAccelerator ( new KeyCodeCombination ( KeyCode.F,
                   KeyCombination.CONTROL_DOWN ) );
         sair.setAccelerator ( new KeyCodeCombination ( KeyCode.C,
                   KeyCombination.CONTROL_DOWN ) );
         arq.getItems ( ).addAll ( pesq, ler, sair );
         menuBar.getMenus ( ).add ( arq );
     }
/*========================================================================*/
     public static void limitTextField ( TextField textField, int limit ) {
         UnaryOperator < Change > textLimitFilter = change -> {
              if ( change.isContentChange ( ) ) {
                   int newLength = change.getControlNewText ( ).length ( );
                   if ( newLength > limit ) {
                        String trimmedText = change.getControlNewText ( )
                                 .substring ( 0, limit );
                        change.setText ( trimmedText );
                        int oldLength = change.getControlText ( ).length ( );
                        change.setRange ( 0, oldLength );
                   }
              }
              return change;
         };
         textField.setTextFormatter ( new TextFormatter < Object > (
                   textLimitFilter ) );
     }
/*========================================================================*/
     public static int fill_Array ( ) throws IOException {      
         int a = 0, i = 0, inicio = 0, fim = 0;
         int SIZE = 1;
         StringBuilder st = new StringBuilder ( );
         String [ ] str = new String [ SIZE ];
         text.appendText ( "" );
         text.clear();
         text.setVisible ( true );
         textField_1 .setVisible ( false );
         t_2.setVisible ( false );
         t_3.setVisible ( false );  
         textField_1 .setVisible ( false );
         for ( i = 0; i < 1; i++ ) {
              inicio = vet [ 0 ];
              fim = vet [ 1 ];
         }
         if ( fim < inicio ) {
              text.setStyle ( "-fx-font-style: italic;"
                        + " -fx-font-weight: bolder;"
                        + " -fx-font-size: 15px;"
                        + "-fx-alignment: center;"
                        + "-fx-text-fill: black" );
              text.appendText ("\n\t\t\t\tO número de linha final digitado\n"
                        + "\t\t\t\té menor que o inicial.\n\n"
                        + "\t\t\t\t\t\tTente novamente.");  
         }
         System.out.printf ( "Início => %d\nFim => %d", inicio, fim );
         BufferedReader f = new BufferedReader ( new FileReader ( file ) );
         i = 0;
         while ( ( str [ i ] = f.readLine ( ) ) != null ) {
              a++;
              if ( a >= inicio && a <= fim ) {
                   st.append ( a + "   " + str [ i ] + "\n" );
              }
         }
         text.appendText ( "" + st );
         f.close ( );      
         return 0;
     }
/*========================================================================*/
     public static int textFieldArr ( ) {
         a_1 = -1;
         text.setVisible ( false );
         t_4.setVisible ( false );
         t_5.setVisible ( false );
         t_6.setVisible ( false );
         t_7.setVisible ( false );
         textField_1.setVisible ( true );
         t_2.setVisible ( true );
         // Usando fonte em italic
         t_2.setFont ( Font.font ( "Helvetica", FontWeight.BOLD,
                   FontPosture.ITALIC, 16 ) );
         // Criando moldura em torno da janela
         vbox.setStyle ( "-fx-padding: 5;"
                   + "-fx-border-style: solid inside;"
                   + "-fx-border-width: 4;"
                   + "-fx-border-insets: 5;"
                   + "-fx-border-radius: 12;"
                   + "-fx-border-color: black;" );
         // Posiciona o textfield no local escolhido
         hbox_1.setPadding ( new Insets ( -165, 0, 10, 345 ) );
         //Limita o textfield para no máximo cinco colunas
         textField_1.setPrefColumnCount ( 5 );
         //Insere uma pequena mensagem ao usuário
         textField_1.setPromptText ("início");
         t_1.setTranslateX ( 100 );
         t_1.setTranslateY ( -210 );
         t_3.setVisible ( false );
         t_2.setTranslateX ( 160 ); 
         t_2.setTranslateY ( -160 );    
         t_2.setFill ( Color.BLACK );
         t_2.setText ( "Número de linha inicial" );
         textField_1.setOnKeyPressed ( new EventHandler < KeyEvent > ( ) {
              @Override
              public void handle ( KeyEvent event ) {
                   //Limita o textfield para no máximo
                   //cinco dígitos em sua entrada
                   limitTextField ( textField_1, 5 );
                   // convertendo string para inteiro
                   if ( event.getCode ( ) == KeyCode.ENTER ) {
                        //qnt recebe a entrada do textfield
                        //convertida para inteiro
                        qnt = Integer.parseInt ( textField_1.getText ( ) );
                        // Usando fonte em italic
                        t_3.setFont ( Font.font ( "Helvetica", FontWeight.BOLD,
                                 FontPosture.ITALIC, 16 ) );
                        if ( qnt > -1 && qnt <= 18195 ) {
                            t_1.setTranslateX ( 100 );
                            t_1.setTranslateY ( -215 );
                            t_2.setVisible ( false );
                            t_3.setVisible ( true );
                            t_3.setTranslateX ( 165 ); 
                            t_3.setTranslateY ( -180 );    
                            t_3.setFill ( Color.BLACK );
                            t_3.setText ( "Número de linha final" );
                            a_1++;
                            vet [ a_1 ] = qnt;
                            textField_1.clear ( );
                            try {
                                 if ( a_1 == 1 )
                                      fill_Array ( );
                            } catch ( IOException e ) {
                                 // TODO Auto-generated catch block
                                 e.printStackTrace();
                            }
                        }
                   }
              }
         } );
         vbox.getChildren ( ).addAll ( hbox_1, t_2, t_3 );
         return qnt;
     }
/*========================================================================*/
     public static int Text_Area ( ) {
         grid.add ( text, 0, 0 );
         grid.setMinHeight ( 220 );
         text.setTranslateY ( 30 );
         text.setStyle ( "-fx-font-style: italic;"
                   + " -fx-font-weight: bolder;"
                   + " -fx-font-size: 15px;"
                   + "-fx-alignment: center;"
                   + "-fx-text-fill: blue" );
         return 0;
     }
/*========================================================================*/
     @Override
     public void start ( Stage stage ) throws Exception {
         // Usando fonte em italic
         t_1.setFont ( Font.font ( "Helvetica", FontWeight.BOLD,
                   FontPosture.ITALIC, 16 ) );
         stage.setTitle ( "JAVAFX - SELECIONANDO LINHAS EM ARQUIVO" );  
         // Criando moldura em torno da janela
         vbox.setStyle ( "-fx-padding: 5;"
                   + "-fx-border-style: solid inside;"
                   + "-fx-border-width: 4;"
                   + "-fx-border-insets: 5;"
                   + "-fx-border-radius: 12;"
                   + "-fx-border-color: blue;" );
         t_1.setTranslateX ( 100 );
         t_1.setTranslateY ( -220 );
         t_1.setFill ( Color.RED );
         t_1.setText ( "JAVAFX - SELECIONANDO LINHAS EM ARQUIVO" );      
         Menu ( );
         Text_Area ( );
         text.setVisible ( false );
         root.setTop ( menuBar );
         vbox.getChildren ( ).addAll ( root, grid, t_1, t_8 );
         stage.setScene ( scene );
         stage.show ( );
     }
/*========================================================================*/
     public static void main ( String [ ] args ) {
         launch ( args );
     }

}

Nenhum comentário:

Postar um comentário

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