Saturday, September 24, 2016

Scene : Contoh Kedua dengan Merubah Title

Contoh Program Kedua

package javafxsceneswitch1;

import javafx.application.Application;

import javafx.event.Event;
import javafx.event.EventHandler;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.paint.Color;
import javafx.stage.Stage;

/**
 *
 * @author Joko
 */
public class JavaFXSceneSwitch1 extends Application {
    ButtonHandler bh;
    Stage stage;
   
    Group group1;
    Scene scene1;
    Button btnToScene2;
   
    Group group2;
    Scene scene2;
    Button btnToScene1;
   
    class ButtonHandler implements EventHandler{

        @Override
        public void handle(Event event) {
            if(event.getSource().equals(btnToScene2)){
                stage.setTitle("I am in scene2");
                stage.setScene(scene2);
            }
            if(event.getSource().equals(btnToScene1)){
                stage.setTitle("I am in scene1");
                stage.setScene(scene1);
            }
        }
       
    }
   
    @Override
    public void start(Stage primaryStage) {
        bh = new ButtonHandler();
        //primaryStage akan disalin rujukannya ke
        //stage
        stage=primaryStage;
       
        //Yang akan ditampilkan pada mulanya adalah
        //scene1
        group1 = new Group();
        btnToScene2 = new Button("Switch to Scene 2");
        btnToScene2.setOnAction(bh);
        group1.getChildren().add(btnToScene2);
        scene1 = new Scene(group1, 300, 250, Color.CADETBLUE);
       
        //Kita juga akan membuat scene2
        group2 = new Group();
        btnToScene1 = new Button("Switch to Scene 1");
        btnToScene1.setOnAction(bh);
        group2.getChildren().add(btnToScene1);
        scene2 = new Scene(group2, 300, 250, Color.MAROON);
       
        primaryStage.setTitle("Scene Switcher");
        primaryStage.setScene(scene1);
        primaryStage.show();
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        launch(args);
    }
   
}

Friday, September 23, 2016

Scene : Program Bertukar Scene

Program bertukar Scene

package javafxswitchscene;

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.paint.Color;
import javafx.stage.Stage;

/**
 *
 * @author Joko Adianto
 */
public class JavaFXSwitchScene extends Application {

    ButtonHandler bh;
    Group root1;
    Group root2;
    //Untuk scene1
    Scene scene1;  
    Button btnToScene2;
 
    //Untuk scene2
    Scene scene2;
    Button btnToScene1;
 
    //Untuk Stage
    Stage stage;
 
    //Inner class untuk handler
    class ButtonHandler
    implements EventHandler <ActionEvent>
    {
        @Override public void handle(ActionEvent e)
        {
            System.out.println("ASDF");
            if(e.getSource().equals(btnToScene2)){
                stage.setScene(scene2);
             
            }
            if(e.getSource().equals(btnToScene1)){
                stage.setScene(scene1);
             
            }
        }
    }
 
    @Override
    public void start(Stage primaryStage) {
        root1 = new Group();
        root2 = new Group();
     
        stage=primaryStage;
        bh = new ButtonHandler();
     
        btnToScene2 = new Button("Switch To Scene 2");
        btnToScene2.setOnAction(bh);
        root1.getChildren().add(btnToScene2);
        scene1 = new Scene(root1, 250, 250, Color.BISQUE);
     
        btnToScene1 = new Button("Switch To Scene 1");
        btnToScene1.setOnAction(bh);
        root2.getChildren().add(btnToScene1);
        scene2 = new Scene(root2, 250, 250, Color.BLACK);
     
     
        stage.setTitle("Switcher");
        stage.setScene(scene1);
        stage.show();

     
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        launch(args);
    }
 
}

Scene : Beberapa Method yang Penting dan Bertukar Scene

Scene

Didalam aplikasi JavaFX paling tidak terdapat sebuh object scene yang diletakkan didalam stage. Scene ini mengikat bermacam-macam control dan node yang ditampilkan melalui object Stage.
  • Beberapa method yang penting adalah :
    • Konstruktor 
      • Scene(Parent root)
      • Scene(Parent root, double width, double height) 
    • double getHeight() mengambil nilai tinggi scene
    • double getWidth() mengambil nilai lebar scene.
    • double getX() mengambil posisi horisontal scene
    • double getY() mengambil posisi vertikal scene.
    • void setRoot(Parent root) menentukan root node
  • Semua Konstruktor wajib memiliki root (dengan nama apapun). Selanjutnya nanti root dapat ditukar dengan setRoot()
  • Turunan Node yang dapat memiliki children adalah Parent
  • Ukuran awal ditentukan dengan nilai width dan height
  • Ukuran Scene dapat diketahui dengan getWidth dan getHeight
  • UKURAN Scene menentukan UKURAN Stage
  • Jika UKURAN object Stage dirubah, maka UKURAN object Scene juga berubah

Bertukar Scene

Pada bagian ini saya akan menuliskan prinsip dasar program dimana setiap kali saya menekan button maka akan dilakukan perubahan scene :
  1. Buat variable berjenis Stage untuk menyimpan primaryStage. Variable ini merupakan class field
  2. Buat paling tidak dua reference variable berjenis Scene
  3. Buat bermacam-macam reference variable untuk kontrol dari masing masing scene
  4. Buat paling tidak sebuah reference variable berjenis StackPane atau Group
  5. Semua variable diinisiasi pada method start
  6. Lalu algoritma untuk berpindah scene : menggunakan method Stage.setScene() 
Posting berikutnya berisi kode program untuk berpindah scene.

Stage : Beberapa Method yang penting

Pada bagian Sebelumnya disebutkan bahwa sebuah aplikasi JavaFX paling tidak memiliki sebuah stage.

Ketika sebuah aplikasi JavaFX dijalankan sebuah object Stage secara otomatis dibuat. Referensi ke object Stage menjadi argumen dari method start :
....
....@Override public void start(Stage primaryStage)
{
//primaryStage merupakan reference variable menunjuk ke
//object Stage dari sebuah aplikasi JavaFX
}
....
....
Stage digunakan untuk mengikat object Scene yang berisi banyak control dan banyak node
Stage memiliki banyak method. Adapun method yang paling banyak digunakan adalah
    • void close()
    • void initModality(Modality modality) 
    • void initStyle(StageStyle style)
    • void getMaxHeight(double maxheight)
    • void getMaxWidth(double maxwidth)
    • void getMinHeight(double maxheight)
    • void getMinWidth(double maxwidth)
    • void setFullScreen(boolean fullscreen)
    • void setIconified(boolean iconified)
    • void setMaximized(boolean maximized)
    • void setMaxHeight(double maxheight) 
    • void setMaxWidth(double maxwidth) 
    • void setMinHeight(double maxheight) 
    • void setMinWidth(double maxwidth) 
    • void setResizable(boolean resizable) 
    • void setScene(Scene scene) 
    • void setTitle(String title) 
    • void show()
    • void showAndWait() 
    • void toFront() 
    • void toBack() 

  • Dari keseluruhan method yang disebutkan diatas : setScene, setTitle, dan show() adalah method yang paling sering digunakan.


  • Supaya tidak bisa dirubah ukuran windows dari aplikasi gunakan setResizable(false)
  • Jika stage bisa dirubah ukuran windowsnya, dengan ukuran maksimum dan minimum tertentu gunakan beberapa method berikut :
    • void setMaxHeight(double maxwidth)
    • void setMaxWidth(double maxwidth)
    • void setMinHeight(double maxheight)
    • void setMinWidth(double maxwidth)
    • void setResizable(boolean resizable)
  • Jika ingin aplikasi menutupi seluruh layar gunakan method berikut : void setFullScreen(boolean fullscreen)
  • Jika ingin membuat windows maximized gunakan method berikut : void setMaximized(boolean maximized)
  • Jika ingin dikecilkan menjadi sebuah icons gunakan method : void setIconified(boolean iconified)
  • void initModality(Modality modality) dan void initStyle(StageStyle style) hanya dapat dijalankan sebelum show






Monday, September 19, 2016

Menangani Kejadian-kejadian pada Aplikasi JavaFX : Event Handling

Pendahuluan

Pada bagian ini kita akan berbicara mengenai :
  1. Konsep dari event
  2. Menggunakan interface/class yang menangani event
  3. Membuat turunan interface EventHandler
  4. Menggunakan inner class untuk event handling
  5. Menggunakan annonymous class untuk event handling
  6. Lambda untuk event handling (akan dicontohkan pada penerbitan halaman berikutnya)

Konsep dari Event

  • Event adalah suatu kejadian (dalam bahasa Indonesia). Secara penulisan program, event adalah sebuah nilai/object yang dibuat ketika pengguna melakukan sebuah aksi dengan sebuah object seperti Button, TextEdit, ataupun control lainnya.  
  • Sebuah event diterbitkan oleh sebuah object, yang merupakan asal dari event.
  • Selanjutnya event akan ditujukan kepada object lain yang dirubah nilainya. Object tersebut merupakan target dari sebuah event.
  • Event handler adalah sebuah object yang menangani terjadinya event.
  • Sebuah aplikasi atau object yang akan bereaksi terhadap sebuah event harus menggunakan interface EventHandler, yang BERUMAH didalam sebuah PACKAGE javafx.event.
  • Interface tersebut memiliki sebuah method : void handle<T event>

Cara-cara penanganan event 

Ada empat cara yang saya pahami untuk penanganan event yaitu :
  • Menggunakan class tak bernama (annonym)
  • Menggunakan inner class
  • Mengimplementasikan interface EventHandler
  • Menggunkan fasilitas lambda untuk java 8 (akan dicontohkan pada penerbitan halaman berikutnya).
Pada dasarnya penanganan event menggunkan urut-urutan kerja sebagai berikut :
  1. Membuat asal event yaitu membuat object dari sebuah control seperti Button
  2. Membuat event handler dengan salah satu dari empat cara diatas
  3. Memasangkan event handler dengan asal event.
Selanjutnya kita akan melihat kode program yang memberikan contoh keempat cara diatas :

Menggunakan class tak bernama (annonym)

package javafxhello;

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

/**
 *
 * @author joko
 */
public class JavaFXHello extends Application {
   
    @Override
    public void start(Stage primaryStage) {
        Button btn = new Button();
        btn.setText("Say 'Hello World'");
        //Object dari sebuah EventHandler
        //tetapi tanpa DIBERI NAMA REFERENSI
        //Operator new digunakan untuk membuat
        //object tersebut
        btn.setOnAction(new EventHandler<ActionEvent>() {
           
            @Override
            public void handle(ActionEvent event) {
                System.out.println("Hello World!");
            }
        });
       
        StackPane root = new StackPane();
        root.getChildren().add(btn);
       
        Scene scene = new Scene(root, 300, 250);
       
        primaryStage.setTitle("Hello World!");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        launch(args);
    }
   
}

Menggunakan class bernama

package javafxhello;

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

/**
 *
 * @author android
 */
public class JavaFXHello extends Application {
   
    Button btn;

    //Inner class untuk handler
    class ButtonHandler   
    implements EventHandler <ActionEvent>
    {
        @Override public void handle(ActionEvent e)   
        {   
            if(e.getSource()==btn){
                System.out.println("Hello World!");           
            }
        }
    }

   
    @Override
    public void start(Stage primaryStage) {
        ButtonHandler bh = new ButtonHandler();
        btn = new Button();
        btn.setText("Say 'Hello World'");
        //berikut ini adalah cara untuk menghubungkan
        //bh dan btn
        btn.setOnAction(bh);
       
        StackPane root = new StackPane();
        root.getChildren().add(btn);
       
        Scene scene = new Scene(root, 300, 250);
       
        primaryStage.setTitle("Hello World!");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        launch(args);
    }
   
}

Mengimplementasikan interface EventHandler

package javafxhello;

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

/**
 *
 * @author android
 */

//Program ini akan mengimplementasikan interface
//EventHandler
public class JavaFXHello extends Application
    implements EventHandler<ActionEvent> {
   
    Button btn;
    //method handle dioveride 
    @Override public void handle(ActionEvent e){
        if (e.getSource()==btn){
            System.out.println("Hello World");
        }  
       
       
    }


   
    @Override
    public void start(Stage primaryStage) {
       
        btn = new Button();
        btn.setText("Say 'Hello World'");
        //berikut ini adalah cara untuk menghubungkan
        //btn dan event handler : yang merupakan dirinya sendiri          

        btn.setOnAction(this);
       
        StackPane root = new StackPane();
        root.getChildren().add(btn);
       
        Scene scene = new Scene(root, 300, 250);
       
        primaryStage.setTitle("Hello World!");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        launch(args);
    }
   
}



JavaFX : Hello World

Pada dasarnya untuk membuat aplikasi JavaFX yang dilakukan adalah :

  1. Import class2 yang diperlukan
  2. Aplikasi harus extends Application
  3. User interface menggunakan bermacam-macam class seperti Button, BorderPane, dan Scene
  4. Selanjutnya WAJIB ADA event handler


Program dengan JavaFX merupakan variasi dari :

  • pembuatan user interface
  • bereaksi terhadap input
  • memutakhirkan layar aplikasi sesuai dengan masukan pengguna



Sekarang kita akan membuat program sederhana : Hello World

package javafxhello;

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

/**
 *
 * @author Joko Adianto
 */
public class JavaFXHello extends Application {
 
    @Override
    public void start(Stage primaryStage) {
        Button btn = new Button();
        btn.setText("Say 'Hello World'");
        btn.setOnAction(new EventHandler<ActionEvent>() {
         
            @Override
            public void handle(ActionEvent event) {
                System.out.println("Hello World!");
            }
        });
     
        StackPane root = new StackPane();
        root.getChildren().add(btn);
     
        Scene scene = new Scene(root, 300, 250);
     
        primaryStage.setTitle("Hello World!");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        launch(args);
    }
 
}


Pada program tersebut kita menggunakan bermacam-macam package :
  • javafx.application : inti dari javafx
  • javafx.stage : container dari semua user interface
  • javafx.scene : container yang mengikat semua elemen user interface yang yang diatampilkan oleh program
  • javafx.scene.layout : berisi layout manager yang mengelola posisi user interface controls
  • javafx.scene.control : berisi class2 dari control seperti Button