mana akses ke sumber data diimplementasikan. DAO sering dikaitkan 

dengan Java EE dan akses ke relational database melalu JDBC API, sebab   memang DAO 

berasal dari pedoman praktek Sun Microsystem. Kebanyakan peggunaan DAO adalah satu 

objek DAO untuk satu objek entity. 

9.5 Kuis dan Latihan Soal 

1. Jelaskan bagaimana cara menangani exception? 

2. Sebutkan macam-macam exception di Java (10 saja)? 

3. Apakah class generik bisa diwariskan? 

4. Apakah design pattern singleton dapat diwariskan? 

 

 128 

 

BAB 11 PEMROGRAMAN JAVA GUI DENGAN JAVA FX 

11.1 Java FX 

JavaFX  adalah framework untuk membangun program-program Java berbasis Graphical 

User Interface (GUI). Ketika Java diperkenalkan, class GUI dipaket dalam sebuah library 

yang dikenal sebagai AbstractWindows Toolkit (AWT). AWT baik digunakan untuk 

mengembangkan user interface grafis sederhana, namun tidak untuk mengembangkan proyek 

GUI yang komprehensif. Selain itu, AWT rentan terhadap bug khususnya perproblem an 

platform. Komponen user interface AWT digantikan oleh library yang lebih baik, fleksibel, 

dan yang dikenal sebagai swing. Komponen swing dilukis secara langsung pada kanvas 

menggunakan kode Java. Komponen swing lebih sedikit bergantung pada platform target, 

dan menggunakan lebih sedikit sumber daya GUI asli. Swing dirancang untuk 

mengembangkan aplikasi GUI desktop. Saat ini penggunaan swing digantikan oleh platform 

GUI yang benar-benar baru yang dikenal sebagai JavaFX.  

JavaFX menggabungkan teknologi GUI modern, JavaFX menyediakan dukungan multitouch 

untuk perangkat yang mendukung sentuhan seperti tablet dan ponsel pintar. JavaFX memiliki 

dukungan animasi 2D, 3D, dan pemutaran video serta audio. Dengan menggunakan 

perangkat lunak pihak ketiga, kita dapat mengembangkan program JavaFX untuk digunakan 

pada perangkat yang menjalankan OS atau Android. JavaFX adalah tool untuk 

mengembangkan aplikasi GUI lintas platform yang kaya pada komputer desktop dan pada 

perangkat genggam. Kode 11.1 merupakan contoh program sederhana untuk JavaFX. 

 Kode 11.1 MyJavaFX.java 

import javafx.application.Application; 

import javafx.scene.Scene; 

import javafx.scene.control.Button; 

import javafx.stage.Stage; 

public class MyJavaFX extends Application { 

 @Override // Override method start method pada class Application 

 public void start(Stage primaryStage) { 

  // membuat scene dan menempatkan suatu  button pada scene 

   Button btOK = new Button("OK"); 

 129 

 

10 

11 

12 

13 

14 

15 

16 

17 

18 

19 

20 

21 

   Scene scene = new Scene(btOK, 600, 250); 

   primaryStage.setTitle("MyJavaFX"); // Set judul stage  

   // menempatkan scene pada stage  

            primaryStage.setScene(scene);  

   primaryStage.show(); // Display stage 

  } 

           /* main method hanya diperlukan  

           untuk IDE yg tdk support JavaFX */ 

  public static void main(String[] args) { 

  Application.launch(args); 

  } 

 } 

Hasil dari Kode 11.1 ketika dijalankan disajikan pada Gambar 11.1. Method start() 

merupakan method yang dibaca pertamakali untuk semua aplikasi javaFX, Method launch 

adalah method statis yang didefinisikan dalam class aplikasi untuk menjalankan aplikasi 

JavaFX yang berdiri sendiri. method Main tidak diperlukan jika program dijalankan dari 

command Line,namun diperlukan untuk menjalankan program JavaFX dari IDE yang tidak  

support dengan JavaFX. Ketika menjalankan aplikasi JavaFX tanpa method main, JVM 

secara otomatis memanggil method launch untuk menjalankan aplikasi. 

 

Gambar 11.1 Hasil tampilan kode MyJavaFX.java 

Class main meng-override method start yang didefinisikan dalam javafx.application. Setelah 

application JavaFX diluncurkan, JVM membangun instance class menggunakan constructor 

no-arg dan memanggil method awal. Method start biasanya menempatkan kontrol UI dalam 

sebuah scene dan menampilkan scene dalam stage, seperti yang ditunjukkan pada Gambar 2 

 

 130 

 

 

Gambar 11.2 (a) Pane dan Group digunakan untuk menempatkan Nodes. (b) Node bisa 

berupa shape,image view,UI control,group, dan pane. 

 

Contoh pembuatan tombol Button dilakukan dengan Button btOK = new Button("OK");. 

Untuk membuat objek Button dan menempatkannya di dalam objek Scene dilakukan dengan 

Scene scene = new Scene(btOK, 600, 250);. Objek Scene dapat dibuat menggunakan 

constructor Scene (node, lebar, tinggi) seperti berikut: Scene scene = new Scene(btOK, 

600, 250);. Membuat scene dengan menentukan lebar dan tinggi dan menempatkan suatu 

node (Button) pada Scene. Objek Stage merupakan suatu window. Objek Stage dengan nama 

primary stage secara otomatis dibuat oleh JVM ketika aplikasi dijalankan. Kode 

primaryStage.setScene(scene); baris ini mengatur scene ke primary stage 

primaryStage.show(); dan ini menampilkan primary stage.  

 

JavaFX memberi nama class Stage dan Scene menggunakan analogi dari sebuah  drama. 

stage dianggap sebagai platform untuk mendukung Scene, dan nodes sebagai aktor untuk 

tampil di Scene. Kita bisa membuat lebih dari satu stage seperti Kode 11.2. 

Kode 11.2 MultipleStageDemo.java 

import javafx.application.Application; 

import javafx.scene.Scene; 

import javafx.scene.control.Button; 

 131 

 

10 

11 

12 

13 

14 

15 

16 

17 

18 

19 

20 

21 

import javafx.stage.Stage; 

public class MultipleStageDemo extends Application { 

 @Override  

 public void start(Stage primaryStage) { 

   Button btOK = new Button("OK"); 

   Scene scene = new Scene(btOK, 600, 250); 

   primaryStage.setTitle("MyJavaFX");  

   primaryStage.setScene(scene);  

   primaryStage.show();  

   Stage stage = new Stage(); // membuat stage baru 

   stage.setTitle("Second Stage"); // Set judul stage 

   // Set  scene dengan sebuah button di dalam stage 

   stage.setScene(new Scene(new Button("New Stage"),  

            200, 250)); 

   stage.setResizable(false); 

   stage.show();     

  } 

 } 

11.2 Panes, Groups, UI Controls, dan Shapes di Java FX 

Pane, Groups, UI controls, dan shapes adalah bagian dari node seperti pada Gambar 11.2 (a). 

Pane secara otomatis meletakkan node di lokasi dengan ukuran yang diinginkan. Node adalah 

komponen visual  seperti shape, image view, UI control, group, atau  pane. Shape dapat 

berupa text, line, circle, ellipse, rectangle, arc, polygon, polyline, dll. Kontrol-UI berupa 

label, button, check box, radio button, text field, text area, and dll. Group merupakan 

container yg mengelompokkan koleksi node. Kode 11.3 memperlihatkan penggunaan Button 

pada JavaFx. 

Kode 11.3 ButtonInPane.java 

import javafx.application.Application; 

import javafx.scene.Scene; 

import javafx.scene.control.Button; 

import javafx.stage.Stage; 

 132 

 

10 

11 

12 

13 

14 

15 

16 

17 

import javafx.scene.layout.StackPane; 

 

public class ButtonInPane extends Application { 

 @Override  

 public void start(Stage primaryStage) {   

  StackPane pane = new StackPane(); 

  pane.getChildren().add(new Button("OK")); 

  Scene scene = new Scene(pane, 200, 50); 

  primaryStage.setTitle("Button in a pane");  

  primaryStage.setScene(scene);  

  primaryStage.show();  

 } 

 

Kode ButtonInPane.java membuat sebuah panel pane(stackPane) kemudian menambahkan 

button sebagai child dari pane. Method getChildren() mengembalikan instans dari 

javafx.collections.ObservableList dimana ObservableList mirip dengan ArrayList 

yang digunakan untuk menyimpan koleksi elemen. pemanggilan method add menambahkan 

elemen button ke dalam list, StackPane menempatkan node ditengah-tengah pane 

bertumpukan dengan elemen node lainnya. Hasil dari kode itu  disajikan pada Gambar 

11.3. 

 

Gambar 11.3 Hasil Kode ButtonInPane.java 

11.3 Property Binding 

JavaFX memperkenalkan konsep yang disebut property binding yang memungkinkan obyek 

target terikat dengan obyek sumber. Jika nilai dalam obyek sumber berubah maka obyek 

target juga secara otomatis berubah. Obyek target disebut sebagai obyek binding atau properti 

binding, dan obyek sumber disebut obyek bindable atau obyek  observable. 

 133 

 

Untuk menampilkan circle agar selalu berada ditengah window meskipun ukuran window 

berubah, koordinat x dan y dari circle perlu diatur ulang ke tengah panel. Hal ini dapat 

dilakukan dengan binding centerX dengan lebar pane 2 dan centerY dengan tinggi pane 2. 

Implementasi itu  diberikan pada Kode 11.4. 

Kode 11.4 ShowCircleCentered.java 

10 

11 

12 

13 

14 

15 

16 

17 

18 

19 

20 

21 

22 

23 

24 

25 

16 

import javafx.application.Application; 

import javafx.scene.Scene; 

import javafx.scene.layout.Pane; 

import javafx.scene.paint.Color; 

import javafx.scene.shape.Circle; 

import javafx.stage.Stage; 

public class ShowCircleCentered extends Application { 

  @Override  

  public void start(Stage primaryStage) { 

   Pane pane = new Pane(); 

    

   Circle circle = new Circle(); 

   

circle.centerXProperty().bind(pane.widthProperty().divide(2)); 

   

circle.centerYProperty().bind(pane.heightProperty().divide(2)); 

   

   circle.setRadius(50); 

   circle.setStroke(Color.BLACK); 

   circle.setFill(Color.WHITE); 

   pane.getChildren().add(circle);    

   Scene scene = new Scene(pane, 200, 200); 

   primaryStage.setTitle("ShowCircle"); 

   primaryStage.setScene(scene);  

   primaryStage.show(); 

  } 

 

 134 

 

Hasil dari Kode ShowCircleCentered.java diperlihatkan pada Gambar 11.4. 

 

Gambar 11.4 Hasil output ShowCircleCentered.java 

11.4 Properties dan Method Node  

Class node mendefinisikan beberapa properti dan method yang secara umum berlaku untuk 

semua node yaitu properti style dan rotate. Properti style pada JavaFX mirip dengan  

cascading style sheets (CSS) yang digunakan untuk mengatur style dari elemen HTML pada 

halaman web, properti style dalam JavaFX disebut CSS JavaFX dan didefinisikan 

menggunakan prefik –fx- . 

Contoh: 

circle.setStyle("−fx−stroke: black; −fx−fill: red;") 

 

Property rotate dapat mengatur sudut perputaran suatu node terhadap titik pusatnya, nilai 

positif membuat node berputar searah jarum jam dan nilai negatif sebaliknya. Implementasi 

dari rotate itu  dilakukan pada Kode 11.5. Hasil dari Kode 11.5 disajikan pada Gambar 

11.5. 

Kode 11.5 NodeStyleRotateDemo.java 

import javafx.application.Application; 

import javafx.scene.Scene; 

import javafx.scene.control.Button; 

import javafx.stage.Stage; 

 135 

 

10 

11 

12 

13 

14 

15 

 

16 

17 

18 

19 

20 

21 

import javafx.scene.layout.StackPane; 

 

public class NodeStyleRotateDemo extends Application { 

 @Override  

 public void start(Stage primaryStage) { 

   StackPane pane = new StackPane(); 

   Button btOK = new Button("OK"); 

   btOK.setStyle("-fx-border-color: blue;"); 

   pane.getChildren().add(btOK); 

   pane.setRotate(45); 

   pane.setStyle("-fx-border-color: red; -fx-background- 

color: lightgray;"); 

   Scene scene = new Scene(pane, 200, 250); 

   primaryStage.setTitle("NodeStyleRotateDemo");     

                      primaryStage.setScene(scene);  

   primaryStage.show();  

  } 

 

 

Gambar 11.5 Hasil dari Kode NodeStyleRotateDemo.java 

Class Color digunakan untuk menentukan warna, JavaFX mendefinisikan class Paint dalam 

menggambar suatu  node. Instan color dapat dibuat menggunakan constructor berikut ini: 

public Color(double r, double g, double b, double opacity);  

 136 

 

Dimana r, g, dan b merupakan komponen warna red,green,blue dengan nilai dengan range 

0.0 (gelap) sampai dengan 1.0 (terang). Nilai opacity menentukan transparansi warna dengan 

nilai berada pada range 0.0 (completely transparent) sampai dengan 1.0 (completely opaque), 

hal ini dikenal sebagai model RGBA (Red Green Blue Alpha). Berikut contoh penerapannya: 

Color color = new Color(0.25, 0.14, 0.333, 0.51); 

Untuk pembuatan font tulisan dengan tipe atau format tertentu. Intansiasi suatu font dapat 

menggunakan constructor-nya atau menggunakan method static. Berikut adalah Contoh 

pembuatan font dengan format tertentu: 

Font font1 = new Font("SansSerif", 16); 

Font font2 = Font.font("Times New Roman", FontWeight.BOLD, 

FontPosture.ITALIC, 12); 

Kode 11.6 merupakan contoh penerapan pengaturan jenis tulisan atau font pada sebuah label. 

Kode 11.6 FontDemo.java 

10 

11 

12 

13 

14 

15 

 

16 

17 

import javafx.application.Application; 

import javafx.scene.Scene; 

import javafx.scene.layout.*; 

import javafx.scene.paint.Color; 

import javafx.scene.shape.Circle; 

import javafx.scene.text.*; 

import javafx.scene.control.*; 

import javafx.stage.Stage; 

 

public class FontDemo extends Application { 

  @Override  

  public void start(Stage primaryStage) { 

   Pane pane = new StackPane();    

   Circle circle = new Circle(); 

   circle.setRadius(50); 

   circle.setStroke(Color.BLACK); 

   circle.setFill(new Color(0.5, 0.5, 0.5, 0.1)); 

   pane.getChildren().add(circle);  

 137 

 

18 

19 

20 

21 

22 

23 

24 

25 

26 

27 

28 

29 

    

   Label label = new Label("JavaFX"); 

            label.setFont(Font.font("Times New Roman", 

            FontWeight.BOLD, FontPosture.ITALIC, 20)); 

   pane.getChildren().add(label); 

 

   Scene scene = new Scene(pane); 

   primaryStage.setTitle("FontDemo");  

   primaryStage.setScene(scene);  

   primaryStage.show();  

  } 

 

Berikutnya adalah penambahan citra atau gambar dengan Java FX yang diwakilkan oleh class 

Image dan Class ImageView. Class Image mewakili suatu citra grafis, sedangkan class 

ImageView digunakan untuk menampilkan suatu citra. Class javafx.scene.image.Image 

mewakili suatu image grafis  dan digunakan untuk menampilkan image dari suatu namaFile 

atau suatu URL Berikut adalah contoh dari membuat suatu objek Image dari suatu gambar 

gif: 

new Image("image/us.gif")  

new Image("http://liveexample.pearsoncmg.com/book/image/ us.gif") 

Kode javafx.scene.image.ImageView merupakan suatu node yang digunakan untuk 

menampilkan image, sebuah ImageView dapat dibuat dari obyek Image, misalnya:  

Image image = new Image("image/us.gif");  

ImageView imageView = new ImageView(image); 

Sebagai alternative suatu ImageView dapat juga dibuat langsung dari suatu file ataupun URL, 

seperti: 

ImageView imageView = new ImageView("image/us.gif"); 

Kode 11.7 merupakan implementasi full dari Image dan ImageView. Gambar 11.6 

merupakan hasil output dari Kode 11.7. 

 138 

 

Kode 11.7 ShowImage.java 

10 

11 

12 

 

13 

14 

15 

16 

17 

18 

19 

20 

21 

22 

23 

24 

25 

26 

27 

28 

import javafx.application.Application; 

import javafx.scene.Scene; 

import javafx.scene.layout.HBox; 

import javafx.scene.layout.Pane; 

import javafx.geometry.Insets; 

import javafx.stage.Stage; 

import javafx.scene.image.Image; 

import javafx.scene.image.ImageView; 

 

public class ShowImage extends Application { 

  @Override  

  public void start(Stage primaryStage) { 

   Pane pane = new HBox(10); 

   pane.setPadding(new Insets(5, 5, 5, 5)); 

   Image image = new Image("image/srt30.png"); 

   pane.getChildren().add(new ImageView(image)); 

   ImageView imageView2 = new ImageView(image); 

   imageView2.setFitHeight(100); 

   imageView2.setFitWidth(100); 

   pane.getChildren().add(imageView2); 

   ImageView imageView3 = new ImageView(image); 

   imageView3.setRotate(90); 

   pane.getChildren().add(imageView3);   

   Scene scene = new Scene(pane); 

   primaryStage.setTitle("ShowImage");  

   primaryStage.setScene(scene);  

   primaryStage.show();  

  } 

 

 139 

 

 

Gambar 11.6 Hasil output ShowImage.java 

JavaFX menyediakan banyak jenis Pane yg secara otomatis menempatkan node pada lokasi 

dan ukuran yang diinginkan. Pane dan Group merupakan container yang mengatur 

penempatan suatu node. Class group digunakan untuk mengelompokkan node dan 

menjalankan transformasi dan mengatur skala dalam group. Obyek Pane dan UI control dapat 

dirubah ukurannya, namun obyek group,shape,dan text tidak dapat dirubah ukurannya. 

JavaFX menyediakan beberapa jenis pane untuk mengorganisir node dalam suatu container 

yang di sajikan pada Tabel 11.1. 

Tabel 11.1 Jenis-jenis Pane 

Class Deskripsi 

Pane Base Class yaitu berupa layout pane, berisi method getChildren untuk 

mengembalikan list node yang ada dalam suatu pane. 

StackPane Menempatkan node di atas node lainnya pada tengah panel 

FlowPane Menempatkan node perbaris secara horisontal atau perkolom secara vertikal 

GridPane Menempatkan node di dalam cell dalam grid 

BorderPane Menempatkan node pada area top,right,bottom,left, dan center. 

HBox Menempatkan node dalam satu baris 

VBox Menempatkan node dalam satu kolom 

 

Menempatkan node secara perbaris dalam susunan horisontal dari kiri ke kanan, atau secara 

perkolom dengan susunan vertikal dari atas ke bawah, dalam susunan sesuai urutan suatu 

 140 

 

node ditambahkan. Setelah satu baris/kolom di isikan, selanjutnya berpindah ke baris/kolom 

baru. Untuk menentukan arah susunan penempatan node baik secara horizontal atau vertical 

digunakan konstanta: Orientation.HORIZONTAL atau Orientation.VERTICAL. Kode 11.8 

merupakan kode untuk menampilkan Pane dan Gambar 11.7 merupakan hasil output dari 

Kode 11.8. 

Kode 11.8 ShowFlowPane.java 

10 

11 

12 

 

13 

14 

15 

16 

17 

18 

19 

20 

21 

22 

23 

24 

25 

import javafx.application.Application; 

import javafx.geometry.Insets; 

import javafx.scene.Scene; 

import javafx.scene.control.Label; 

import javafx.scene.control.TextField; 

import javafx.scene.layout.FlowPane; 

import javafx.stage.Stage; 

public class ShowFlowPane extends Application { 

  @Override  

  public void start(Stage primaryStage) {    

   FlowPane pane = new FlowPane(); 

   pane.setPadding(new Insets(11, 12, 13, 14)); 

   pane.setHgap(5); 

   pane.setVgap(5);    

   pane.getChildren().addAll(new Label("First Name:"), 

             new TextField(),new Label("MI:")); 

   TextField tfMi = new TextField(); 

   tfMi.setPrefColumnCount(1); 

   pane.getChildren().addAll(tfMi,  

             new Label("Last Name:"),new TextField()); 

   Scene scene = new Scene(pane, 200, 250); 

   primaryStage.setTitle("ShowFlowPane");  

   primaryStage.setScene(scene);  

   primaryStage.show();  

  } 

 } 

 141 

 

 

 

Gambar 11.7 Hasil output ShowFlowPane.java 

GridPane menyusun  node  dalam bentuk susunan grid/matriks, suatu node ditempatkan pada 

suatu cell. 

Kode 11.8 ShowGridPane.java 

10 

11 

12 

13 

14 

15 

16 

17 

import javafx.application.Application; 

import javafx.geometry.HPos; 

import javafx.geometry.Insets; 

import javafx.geometry.Pos; 

import javafx.scene.Scene; 

import javafx.scene.control.Button; 

import javafx.scene.control.Label; 

import javafx.scene.control.TextField; 

import javafx.scene.layout.GridPane; 

import javafx.stage.Stage; 

 

public class ShowGridPane extends Application { 

  @Override  

  public void start(Stage primaryStage) { 

    

   GridPane pane = new GridPane(); 

   pane.setAlignment(Pos.CENTER); 

 142 

 

18 

19 

20 

21 

22 

23 

24 

25 

26 

27 

28 

29 

30 

31 

32 

33 

34 

35 

36 

37 

   pane.setPadding(new Insets(11.5, 12.5, 13.5, 14.5)); 

   pane.setHgap(5.5); 

   pane.setVgap(5.5); 

 

   pane.add(new Label("First Name:"), 0, 0); 

   pane.add(new TextField(), 1, 0); 

   pane.add(new Label("MI:"), 0, 1); 

   pane.add(new TextField(), 1, 1); 

   pane.add(new Label("Last Name:"), 0, 2); 

   pane.add(new TextField(), 1, 2); 

   Button btAdd = new Button("Add Name"); 

   pane.add(btAdd, 1, 3); 

   GridPane.setHalignment(btAdd, HPos.RIGHT); 

    

   Scene scene = new Scene(pane); 

   primaryStage.setTitle("ShowGridPane");  

   primaryStage.setScene(scene); 

   primaryStage.show();  

  } 

Output 

 

 

11.4.1 BorderPane 

BorderPane  menempatkan node pada lima area yaitu: top,right,bottom,left, dan center 

dengan menggunakan method:setTop(node), setBottom(node), setLeft(node), setRight (node) 

, dan setCenter(node). 

 143 

 

Kode 11.9 ShowBorderPane.java 

10 

11 

12 

13 

14 

15 

16 

17 

18 

19 

20 

21 

22 

23 

24 

25 

26 

27 

28 

29 

30 

31 

import javafx.application.Application; 

import javafx.geometry.Insets; 

import javafx.scene.Scene; 

import javafx.scene.control.Label; 

import javafx.scene.layout.BorderPane; 

import javafx.scene.layout.StackPane; 

import javafx.stage.Stage; 

 

public class ShowBorderPane extends Application { 

  @Override  

  public void start(Stage primaryStage) { 

   BorderPane pane = new BorderPane(); 

   pane.setTop(new CustomPane("Top")); 

   pane.setRight(new CustomPane("Right")); 

   pane.setBottom(new CustomPane("Bottom")); 

   pane.setLeft(new CustomPane("Left")); 

   pane.setCenter(new CustomPane("Center")); 

 

   Scene scene = new Scene(pane); 

   primaryStage.setTitle("ShowBorderPane");  

   primaryStage.setScene(scene); 

   primaryStage.show();  

 } 

 

class CustomPane extends StackPane { 

 public CustomPane(String title) { 

   getChildren().add(new Label(title)); 

   setStyle("-fx-border-color: red"); 

   setPadding(new Insets(11.5, 12.5, 13.5, 14.5)); 

  } 

 144 

 

32 } 

Output 

 

 

11.4.2 HBox dan  VBox  

HBox Menempatkan node dalam susunan satu baris, sedangkan Vbox menempatkan node 

dalam susunan satu kolom. 

Kode 11.10 BoxVBox.java 

10 

11 

12 

13 

14 

15 

16 

17 

18 

import javafx.application.Application; 

import javafx.geometry.Insets; 

import javafx.scene.Scene; 

import javafx.scene.control.Button; 

import javafx.scene.control.Label; 

import javafx.scene.layout.BorderPane; 

import javafx.scene.layout.HBox; 

import javafx.scene.layout.VBox; 

import javafx.stage.Stage; 

import javafx.scene.image.Image; 

import javafx.scene.image.ImageView; 

 

public class ShowHBoxVBox extends Application { 

  @Override  

  public void start(Stage primaryStage) { 

    

   BorderPane pane = new BorderPane();    

   pane.setTop(getHBox()); 

 145 

 

19 

20 

21 

22 

23 

24 

25 

26 

27 

28 

29 

30 

31 

 

32 

33 

34 

35 

36 

37 

38 

39 

40 

41 

 

42 

43 

44 

45 

46 

47 

48 

   pane.setLeft(getVBox()); 

   Scene scene = new Scene(pane); 

   primaryStage.setTitle("ShowHBoxVBox");  

   primaryStage.setScene(scene);  

   primaryStage.show();  

  } 

  private HBox getHBox() { 

   HBox hBox = new HBox(15); 

   hBox.setPadding(new Insets(15, 15, 15, 15)); 

   hBox.setStyle("−fx−background−color: gold"); 

   hBox.getChildren().add(new Button("Computer Science")); 

   hBox.getChildren().add(new Button("Chemistry")); 

   ImageView imageView = new ImageView(new  

Image("image/srt30.png")); 

   hBox.getChildren().add(imageView); 

   return hBox; 

  } 

 

  private VBox getVBox() { 

   VBox vBox = new VBox(15); 

   vBox.setPadding(new Insets(15, 5, 5, 5)); 

   vBox.getChildren().add(new Label("Courses")); 

 

   Label[] courses = {new Label("CSCI 1301"), new  

Label("CSCI 1302"), 

   new Label("CSCI 2410"), new Label("CSCI 3720")}; 

 

   for (Label course: courses) { 

    VBox.setMargin(course, new Insets(0, 0, 0, 15)); 

    vBox.getChildren().add(course); 

  } 

  return vBox; 

 146 

 

49 

50 

  } 

Output 

 

 

11.5 Event-Driven Programming 

Tidak semua obyek  bisa ditangani menjadi event-action. Untuk bisa menjadi pengendali dari 

suatu event-action ada dua persyaratan harus dipenuhi: 

1.  Obyek harus merupakan instan dari interface EventHandler<T extends Event>. 

2. Obyek Event Handler harus diregistrasikan dengan obyek event source menggunakan 

method source.setOnAction(handler). 

Untuk merespon sebuah button click, maka diperlukan kode untuk memproses aksi button 

click itu . button merupakan obyek event-source  yang merupakan tempat action berasal. 

Diperlukan pembuatan obyek yang mampu menangani event-action pada button. Obyek ini 

disebut event handler, seperti yang ditunjukkan pada Gambar berikut: 

 

 

        click pada button                     event  merupakan                     event-handler 

      mengaktifkan action-event             suatu obyek                        memproses event   

        (obyek event-source)     (event-object)                     (obyek event-handler) 

 

Gambar 11.8 Pemrograman event-driven 

button event handler 

 147 

 

Interface EventHandler<ActionEvent> berisi method handle(ActionEvent) utk memproses 

action-event. Class handler yang dibuat harus melakukan override method ini untuk 

merespon suatu event. 

HandleEvent.java 

10 

11 

12 

13 

14 

15 

16 

17 

18 

19 

20 

21 

22 

23 

24 

25 

26 

27 

28 

import javafx.application.Application; 

import javafx.geometry.Pos; 

import javafx.scene.Scene; 

import javafx.scene.control.Button; 

import javafx.scene.layout.HBox; 

import javafx.stage.Stage; 

import javafx.event.ActionEvent; 

import javafx.event.EventHandler; 

public class HandleEvent extends Application { 

  @Override  

  public void start(Stage primaryStage) { 

   HBox pane = new HBox(10); 

   pane.setAlignment(Pos.CENTER); 

   Button btOK = new Button("OK"); 

   Button btCancel = new Button("Cancel"); 

   OKHandlerClass handler1 = new OKHandlerClass(); 

   btOK.setOnAction(handler1); 

   CancelHandlerClass handler2 = new CancelHandlerClass(); 

   btCancel.setOnAction(handler2); 

   pane.getChildren().addAll(btOK, btCancel); 

 

   Scene scene = new Scene(pane); 

   primaryStage.setTitle("HandleEvent");  

   primaryStage.setScene(scene);  

   primaryStage.show();  

  } 

 

 148 

 

29 

30 

31 

32 

33 

34 

35 

36 

37 

38 

39 

40 

41 

class OKHandlerClass implements EventHandler<ActionEvent> { 

  @Override 

  public void handle(ActionEvent e) { 

  System.out.println("OK button clicked"); 

  } 

 

class CancelHandlerClass implements EventHandler<ActionEvent> { 

 @Override 

  public void handle(ActionEvent e) { 

  System.out.println("Cancel button clicked"); 

  } 

Output 

 

 

Dua class handler yang didefinisikan pada listing code diatas dan masing--masing class 

handler  meng-implementasikan EventHandler<ActionEvent> untuk memproses Action-

Event. Obyek handler1 merupakan instan dari class OKHandler,yang diregistrasikan untuk 

button btOK. Ketika button OK diclick method handle(ActionEvent) dalam class OKHandler 

dipanggil untuk memproses event. 

11.6 Events dan Event Sources 

Eent adalah suatu obyek yang dibuat dari suatu event-source , membangkitkan event artinya 

membuat suatu event dan mendelegasikan handler untuk menghandle event itu . 

 149 

 

Program GUI java berinteraksi dengan user dan event mengendalikan(drive) eksekusinya 

proses seperti ini disebut pemrograman event-driven. Event dapat didefinisikan sebagai 

sinyal ke program bahwa  sesuatu telah terjadi. event dibangkitkan oleh aksi-aksi user seperti 

pergerakan mouse,click mouse, penekanan tombol. program dapat memilih utk merespon 

atau mengabaikan event. 

Komponen yang menciptakan suatu event dan menjalankannya disebut event-source/source-

object/source-component,sebagai contoh button merupakan source-object dari suatu action-

event button-click. Event merupakan instan dari suatu class event dan java.util.EventObject 

adalah class root  dari susuanan hirarki hubungan class-class event sebagai berikut: 

 

 

 

 

 

Gambar 11.9 obyek event pada JavaFX yang merupakan obyek dari class javafx.event.Event 

 

11.7 Inner Class 

Inner class/nested class merupakan suatu class yang didefinisikan dalam lingkup class 

lainnya, inner classes berguna untuk mendefinisikan class-class handler. Pada umumnya 

inner class hanya digunakan oleh outer class-nya.  

Kode 11.11 Luar.java Kode 11.12 TestInnerClass.java 

 

public class Luar { 

   int varLuar; 

   void printLuar(){ 

     System.out.println("cetak  

luar"); 

   }  

   class Dalam { 

 

 

public class TestInnerClass{ 

   public static void  

main(String[] x){ 

      //cara1 membuat obyek 

      Luar l = new Luar(); 

      Luar.Dalam d = l.new  

Dalam(); 

EventObject Event 

ActionEvent 

InputEvent 

WindowEvent 

MouseEvent 

KeyEvent 

 150 

 

 

10 

11 

12 

      int varDalam; 

      void printDalam(){ 

      System.out.println("cetak  

dalam");     

     }    

   } 

10 

 

11 

12 

13 

      l.printLuar(); 

      d.printDalam();  

     

     //cara2 membuat obyek     

     Luar.Dalam dlm = new  

Luar().new Dalam(); 

     dlm.printDalam(); 

  } 

}   

Output kode 11.12 

 

Contoh menggunakan inner class: 

Kode 11.13 HandleEvent2.java 

10 

11 

12 

13 

14 

import javafx.application.Application; 

import javafx.geometry.Pos; 

import javafx.scene.Scene; 

import javafx.scene.control.Button; 

import javafx.scene.layout.HBox; 

import javafx.stage.Stage; 

import javafx.event.ActionEvent; 

import javafx.event.EventHandler; 

public class HandleEvent2 extends Application { 

  public void start(Stage primaryStage) { 

   HBox pane = new HBox(10); 

   pane.setAlignment(Pos.CENTER); 

   Button btOK = new Button("OK"); 

   Button btCancel = new Button("Cancel"); 

 151 

 

15 

16 

17 

18 

19 

20 

21 

22 

23 

24 

25 

26 

27 

28 

29 

30 

31 

32 

33 

34 

35 

36 

37 

38 

39 

40 

41 

42 

43 

   //OKHandlerClass handler1 = new OKHandlerClass(); 

   //btOK.setOnAction(handler1); 

   //membuat obyek handler   

   btOK.setOnAction(new OKHandlerClass()); 

   //CancelHandlerClass handler2 = new 

CancelHandlerClass(); 

   //btCancel.setOnAction(handler2); 

   //membuat obyek handler   

   btCancel.setOnAction(new CancelHandlerClass());  

   pane.getChildren().addAll(btOK, btCancel); 

   Scene scene = new Scene(pane); 

   primaryStage.setTitle("HandleEvent");  

   primaryStage.setScene(scene);  

   primaryStage.show();  

  } 

           //inner classs 

 class OKHandlerClass implements EventHandler<ActionEvent> { 

   @Override 

   public void handle(ActionEvent e) { 

   System.out.println("OK button clicked"); 

   } 

 } 

 //inner classs 

 class CancelHandlerClass implements EventHandler<ActionEvent> { 

  @Override 

   public void handle(ActionEvent e) { 

   System.out.println("Cancel button clicked"); 

   } 

 } 

Output: 

 152 

 

 

 

11.8 Handler berupa Anonymous Inner-Class  

Anonymous inner class merupakan suatu inner class tanpa nama,dimana dalam 

mendefinisikan suatu inner class sekaligus juga  membuat instannya. 

Contoh menggunakan anonymous inner class: 

Kode 11. 14 HandleEvent3.java 

10 

11 

12 

13 

14 

15 

16 

17 

import javafx.application.Application; 

import javafx.geometry.Pos; 

import javafx.scene.Scene; 

import javafx.scene.control.Button; 

import javafx.scene.layout.HBox; 

import javafx.stage.Stage; 

import javafx.event.ActionEvent; 

import javafx.event.EventHandler; 

public class HandleEvent3 extends Application { 

  @Override  

  public void start(Stage primaryStage) { 

   HBox pane = new HBox(10); 

   pane.setAlignment(Pos.CENTER); 

   Button btOK = new Button("OK"); 

   Button btCancel = new Button("Cancel"); 

   //membuat obyek handler   

   //btOK.setOnAction(new OKHandlerClass()); 

 153 

 

18 

19 

 

20 

21 

22 

23 

24 

25 

26 

27 

28 

29 

30 

31 

32 

33 

34 

35 

36 

37 

38 

                     //menggunakan Anonymous inner class    

                     btOK.setOnAction(new  

EventHandler<ActionEvent>(){ 

    public void handle(ActionEvent e) { 

    System.out.println("OK button clicked"); 

    }     

   }); 

   //membuat obyek handler   

   //btCancel.setOnAction(new CancelHandlerClass());  

                       //menggunakan Anonymous inner class 

   btCancel.setOnAction(new EventHandler<ActionEvent>(){ 

    public void handle(ActionEvent e) { 

    System.out.println("Cancel button clicked"); 

    }     

   });    

   pane.getChildren().addAll(btOK, btCancel); 

   Scene scene = new Scene(pane); 

   primaryStage.setTitle("HandleEvent");  

   primaryStage.setScene(scene);  

   primaryStage.show();  

  } 

Output: 

 

 

11.9 Lambda Expressions 

Lambda expressions digunakan untuk menyederhanakan penggunaan code dalam event-

handling. 

 154 

 

Kode 11. 15 HandleEvent4.java 

10 

11 

12 

13 

14 

15 

16 

17 

18 

19 

20 

21 

22 

23 

24 

25 

26 

27 

28 

29 

30 

31 

import javafx.application.Application; 

import javafx.geometry.Pos; 

import javafx.scene.Scene; 

import javafx.scene.control.Button; 

import javafx.scene.layout.HBox; 

import javafx.stage.Stage; 

import javafx.event.ActionEvent; 

import javafx.event.EventHandler; 

public class HandleEvent4 extends Application { 

  @Override  

  public void start(Stage primaryStage) { 

   HBox pane = new HBox(10); 

   pane.setAlignment(Pos.CENTER); 

   Button btOK = new Button("OK"); 

   Button btCancel = new Button("Cancel"); 

   //membuat obyek handler   

     btOK.setOnAction((ActionEvent e) -> { 

           System.out.println("OK button clicked"); 

    }); 

   //membuat obyek handler   

   //membuat obyek handler   

     btCancel.setOnAction((ActionEvent e) -> { 

           System.out.println("Cancel button clicked"); 

    }); 

   pane.getChildren().addAll(btOK, btCancel); 

   Scene scene = new Scene(pane); 

   primaryStage.setTitle("HandleEvent");  

   primaryStage.setScene(scene);  

   primaryStage.show();  

  } 

 155 

 

Output 

 

 

11.10 Studi kasus aplikasi GUI menghitung Hutang 

Berikut adalah contoh kode program GUI sederhana untuk membuat kalkulator hutang. 

Kode 11.16 Hutang.java 

10 

11 

12 

13 

14 

15 

16 

17 

18 

19 

20 

21 

public class Hutang { 

 private double bungaPerTahun; 

 private int jmlTahun; 

 private double jmlPinjaman; 

 private java.util.Date tglPeminjaman; 

 public Hutang() { 

  this(2.5, 1, 1000); 

  } 

  public Hutang(double bungaPerTahun, int jmlTahun,double 

jmlPinjaman)         

      { 

   this.bungaPerTahun = bungaPerTahun; 

   this.jmlTahun = jmlTahun; 

   this.jmlPinjaman = jmlPinjaman; 

   tglPeminjaman = new java.util.Date(); 

  } 

 

  public double getBungaPerTahun() { 

  return bungaPerTahun; 

  } 

 

  public void setBungaPerTahun(double bungaPerTahun) { 

 156 

 

22 

23 

24 

25 

26 

27 

28 

29 

30 

31 

32 

33 

34 

35 

36 

37 

38 

39 

40 

41 

42 

43 

44 

 

45 

46 

47 

48 

49 

50 

51 

52 

  this.bungaPerTahun = bungaPerTahun; 

  } 

 

  public int getJmlTahun() { 

  return jmlTahun; 

  } 

 

  public void setJmlTahun(int jmlTahun) { 

  this.jmlTahun = jmlTahun; 

  } 

 

  public double getJmlPinjaman() { 

  return jmlPinjaman; 

  } 

 

  public void setJmlPinjaman(double jmlPinjaman) { 

  this.jmlPinjaman = jmlPinjaman; 

  } 

 

  public double getBayarPerBulan() { 

   double bungaPerBulan = bungaPerTahun / 1200; 

   double BayarPerBulan = jmlPinjaman * bungaPerBulan/  

  (1 - (1 / Math.pow(1 + bungaPerBulan, jmlTahun * 12))); 

   return BayarPerBulan; 

  } 

 

  public double getTotalBayar() { 

   double totalBayar = getBayarPerBulan() * jmlTahun * 12; 

   return totalBayar; 

  } 

  public java.util.Date getTglPeminjaman() { 

  return tglPeminjaman; 

 157 

 

53 

54 

  } 

}  

Kode 11. 17 HitungHutang.java 

10 

11 

12 

13 

14 

15 

16 

17 

18 

19 

20 

21 

22 

23 

24 

25 

26 

27 

28 

29 

import javafx.application.Application; 

import javafx.geometry.Pos; 

import javafx.geometry.HPos; 

import javafx.scene.Scene; 

import javafx.scene.control.Button; 

import javafx.scene.control.Label; 

import javafx.scene.control.TextField; 

import javafx.scene.layout.GridPane; 

import javafx.stage.Stage; 

 

public class HitungHutang extends Application { 

 private TextField tfBungaPerTahun = new TextField(); 

 private TextField tfJmlTahun = new TextField(); 

 private TextField tfJmlHutang = new TextField(); 

 private TextField tfBayarPerBulan = new TextField(); 

 private TextField tfTotalBayar = new TextField(); 

 private Button btHitung = new Button("Hitung"); 

 

 @Override  

 public void start(Stage primaryStage) { 

   // membuat UI 

   GridPane gridPane = new GridPane(); 

   gridPane.setHgap(5); 

   gridPane.setVgap(5); 

   gridPane.add(new Label("Bunga Tahunan:"), 0, 0); 

   gridPane.add(tfBungaPerTahun, 1, 0); 

   gridPane.add(new Label("Jml Tahun:"), 0, 1); 

   gridPane.add(tfJmlTahun, 1, 1); 

   gridPane.add(new Label("Jml Hutang:"), 0, 2); 

 158 

 

30 

31 

32 

33 

34 

35 

36 

37 

38 

39 

40 

41 

42 

43 

44 

 

45 

46 

47 

48 

49 

50 

51 

52 

53 

54 

55 

56 

57 

58 

59 

 

   gridPane.add(tfJmlHutang, 1, 2); 

   gridPane.add(new Label("Pembayaran per bulan:"), 0, 3); 

   gridPane.add(tfBayarPerBulan, 1, 3); 

   gridPane.add(new Label("Pembayaran Total:"), 0, 4); 

   gridPane.add(tfTotalBayar, 1, 4); 

   gridPane.add(btHitung, 1, 5); 

 

   // Set properti  UI 

   gridPane.setAlignment(Pos.CENTER); 

   tfBungaPerTahun.setAlignment(Pos.BOTTOM_RIGHT); 

   tfJmlTahun.setAlignment(Pos.BOTTOM_RIGHT); 

   tfJmlHutang.setAlignment(Pos.BOTTOM_RIGHT); 

   tfBayarPerBulan.setAlignment(Pos.BOTTOM_RIGHT); 

   tfTotalBayar.setAlignment(Pos.BOTTOM_RIGHT); 

   tfBayarPerBulan.setEditable(false); 

   tfTotalBayar.setEditable(false); 

   GridPane.setHalignment(btHitung, HPos.RIGHT); 

 

   // Process events 

   btHitung.setOnAction(e -> hitungPembayaranHutang()); 

 

   // buat scene dan tempatkan dlm stage 

   Scene scene = new Scene(gridPane, 400, 250); 

   primaryStage.setTitle("Menghitung Hutang");  

   primaryStage.setScene(scene);  

   primaryStage.show();  

 } 

 

 private void hitungPembayaranHutang() { 

   // ambil nilai dari text fields 

   double bunga =  

Double.parseDouble(tfBungaPerTahun.getText()); 

 159 

 

60 

61 

 

62 

63 

64 

65 

66 

67 

 

68 

 

69 

70 

   int year = Integer.parseInt(tfJmlTahun.getText()); 

   double loanAmount =  

Double.parseDouble(tfJmlHutang.getText()); 

 

   // membuat obyek hutang  

   Hutang hutang = new Hutang(bunga, year, loanAmount); 

 

   // Display pembayaran bulanan dan pembayaran total  

 tfBayarPerBulan.setText(String.format("Rp%.2f",hutang. 

getBayarPerBulan())); 

 tfTotalBayar.setText(String.format("Rp%.2f",hutang. 

getTotalBayar())); 

 } 

Output 

 

11.11 JavaFX UI Controls  

Diagram kontrol dari keseluruhan JavaFX UI disajikan pada Gambar 11.10. 

 160 

 

 

Gambar11.10 UI controls yang sering digunakan dalam membuat user-interface 

11.11.1 Label 

Label adalah area tampilan untuk teks pendek ataupun node. Label sering digunakan untuk 

memberi keterangan teks (memberi label) terhadap suatu UI kontrol. 

Membuat label: 

Label lb1 = new Label("US\n50 States", us); 

lb1.setStyle("−fx−border−color: green; −fx-border−width: 2"); 

lb1.setContentDisplay(ContentDisplay.BOTTOM); 

lb1.setTextFill(Color.RED); 

 

 

Tabel 11.2 Konstruktor dan deskripsi Label 

Constructor Deskripsi 

Label() Membuat label kosong 

Label(text: String) Membuat label dengan suatu teks  

Label(text: String, graphic: Node) Membuat label dengan teks dan gambar 

 

Tabel 11.3 Properti dan deskripsi Label 

 161 

 

Properti Deskripsi 

Alignment : <Pos> Menentukan alignment dari text dan node yang diberi 

label 

contentDisplay : <ContentDisplay> Menentukan posisi node relatif thd teks dengan 

menggunakan constanta ContentDisplay TOP, 

BOTTOM,LEFT, dan RIGHT dalam. 

Graphic: <Node> Menentukan gamabar pada label 

graphicTextGap: Double Jarak/Gap antara gambar dan teks 

textFill: <Paint> <paint> yang digunakan untuk mengisi teks 

text: String Teks pada label 

underLine:Boolean Menentukan apakah underline atau tidak 

wrapText: Boolean Menentukan apakah teks dilakukan wrap jika panjang 

teks melebihi lebar label. 

 

Kode 11.18 LabelWithGraphic.java 

10 

11 

12 

13 

import javafx.application.Application; 

import javafx.stage.Stage; 

import javafx.scene.Scene; 

import javafx.scene.control.ContentDisplay; 

import javafx.scene.control.Label; 

import javafx.scene.image.Image; 

import javafx.scene.image.ImageView; 

import javafx.scene.layout.HBox; 

import javafx.scene.layout.StackPane; 

import javafx.scene.paint.Color; 

import javafx.scene.shape.Circle; 

import javafx.scene.shape.Rectangle; 

import javafx.scene.shape.Ellipse; 

 162 

 

14 

15 

16 

17 

 

18 

19 

20 

21 

22 

 

23 

24 

25 

26 

27 

28 

 

29 

30 

 

31 

32 

33 

34 

35 

36 

 

37 

 

38 

39 

public class LabelWithGraphic extends Application { 

  @Override  

  public void start(Stage primaryStage) {    

   ImageView ina = new ImageView(new  

Image("image/benderaIna.jpeg")); 

   ina.setPreserveRatio(true); 

   ina.setFitWidth(250); 

   //membuat label dengan teks dan gambar 

   Label lb1 = new Label("INA\nIndonesia", ina); 

   lb1.setStyle("-fx-border-color: green; -fx-border-width:  

2"); 

   lb1.setContentDisplay(ContentDisplay.BOTTOM); 

   lb1.setTextFill(Color.RED); 

   Label lb2 = new Label("Circle", new Circle(50, 50, 25)); 

   lb2.setContentDisplay(ContentDisplay.TOP); 

   lb2.setTextFill(Color.ORANGE); 

   Label lb3 = new Label("Rectangle", new Rectangle(10, 10,  

50, 25)); 

   lb3.setContentDisplay(ContentDisplay.RIGHT); 

   Label lb4 = new Label("Ellipse", new Ellipse(50, 50, 50,  

25)); 

   lb4.setContentDisplay(ContentDisplay.LEFT); 

   Ellipse ellipse = new Ellipse(50, 50, 50, 25); 

   ellipse.setStroke(Color.GREEN); 

   ellipse.setFill(Color.WHITE); 

   StackPane stackPane = new StackPane(); 

   stackPane.getChildren().addAll(ellipse, new  

Label("JavaFX")); 

   Label lb5 = new Label("pane dalam sebuah label",  

stackPane); 

   lb5.setContentDisplay(ContentDisplay.BOTTOM); 

   HBox pane = new HBox(20); 

 163 

 

40 

41 

42 

43 

44 

 

45 

46 

   pane.getChildren().addAll(lb1, lb2, lb3, lb4, lb5); 

    

   Scene scene = new Scene(pane, 750, 300); 

   primaryStage.setTitle("LabelWithGraphic");  

   primaryStage.setScene(scene);  

   primaryStage.show();  

  } 

Output 

 

 

11.11.2 Button 

Button adalah suatu tombol yang membangkitkan event ketika diclick. JavaFX menyediakan 

regular buttons, toggle buttons, check box buttons, dan radio buttons. 

 

Tabel 11.4 Konstruktor dan deskripsi Button 

Constructor Deskripsi 

Button() Membuat button kosong 

Button(text: String) Membuat button dengan suatu teks  

Button(text: String, graphic: Node) Membuat button dengan teks dan gambar 

 

 

 164 

 

Kode 11.19 ButtonDemo.java 

10 

11 

12 

13 

14 

15 

16 

 

17 

 

18 

19 

20 

21 

22 

23 

24 

25 

26 

27 

28 

29 

import javafx.application.Application; 

import javafx.stage.Stage; 

import javafx.geometry.Pos; 

import javafx.scene.Scene; 

import javafx.scene.control.Button; 

import javafx.scene.image.ImageView; 

import javafx.scene.layout.BorderPane; 

import javafx.scene.layout.HBox; 

import javafx.scene.layout.Pane; 

import javafx.scene.text.Text; 

 

public class ButtonDemo extends Application { 

  protected Text text = new Text(50, 50, "JavaFX Programming"); 

  protected BorderPane getPane() { 

   HBox paneForButtons = new HBox(20); 

   Button btLeft = new Button("Kiri",new  

ImageView("image/panahKiri.png")); 

              Button btRight = new Button("Kanan",new  

ImageView("image/panahKanan.png")); 

   paneForButtons.getChildren().addAll(btLeft, btRight); 

   paneForButtons.setAlignment(Pos.CENTER); 

   paneForButtons.setStyle("−fx−border−color: green"); 

 

   BorderPane pane = new BorderPane(); 

   pane.setBottom(paneForButtons); 

 

   Pane paneForText = new Pane(); 

   paneForText.getChildren().add(text); 

   pane.setCenter(paneForText); 

   btLeft.setOnAction(e->text.setX(text.getX() - 10)); 

   btRight.setOnAction(e -> text.setX(text.getX() + 10)); 

 165 

 

30 

31 

32 

33 

34 

35 

36 

37 

38 

39 

   return pane; 

  } 

  @Override  

  public void start(Stage primaryStage) { 

   Scene scene = new Scene(getPane(), 450, 200); 

   primaryStage.setTitle("ButtonDemo");  

   primaryStage.setScene(scene);  

   primaryStage.show();  

  } 

Output 

 

 

11.11.3 CheckBox 

CheckBox digunakan user untuk menentukan pilihan mirip dengan button sebuah checkbox 

memiliki properti turunan yaitu onAction, text, graphis, dan lain-lain. 

Tabel 11.5 Konstruktor dan deskripsi CheckBox 

Constructor Deskripsi 

CheckBox() Membuat checkbox kosong 

CheckBox(text: String) Membuat checkbox dengan suatu teks  

Contoh checkbox: 

CheckBox chkUS = new CheckBox("US"); 

chkUS.setGraphic(new ImageView("image/usIcon.gif")); 

chkUS.setTextFill(Color.GREEN); 

chkUS.setContentDisplay(ContentDisplay.LEFT); 

 166 

 

chkUS.setStyle("−fx−border−color: black"); 

chkUS.setSelected(true); 

chkUS.setPadding(new Insets(5, 5, 5, 5)); 

 

Kode 11.20 CheckBoxDemo.java 

10 

11 

12 

13 

14 

15 

16 

17 

18 

19 

20 

21 

22 

23 

24 

25 

26 

27 

import javafx.event.ActionEvent; 

import javafx.event.EventHandler; 

import javafx.geometry.Insets; 

import javafx.scene.control.CheckBox; 

import javafx.scene.layout.BorderPane; 

import javafx.scene.layout.VBox; 

import javafx.scene.text.Font; 

import javafx.scene.text.FontPosture; 

import javafx.scene.text.FontWeight; 

public class CheckBoxDemo extends ButtonDemo { 

  @Override  

  protected BorderPane getPane() { 

   BorderPane pane = super.getPane(); 

   Font fontBoldItalic = Font.font("Times New Roman", 

   FontWeight.BOLD, FontPosture.ITALIC, 24); 

   Font fontBold = Font.font("Times New Roman", 

   FontWeight.BOLD, FontPosture.REGULAR, 24); 

   Font fontItalic = Font.font("Times New Roman", 

   FontWeight.NORMAL, FontPosture.ITALIC, 24); 

   Font fontNormal = Font.font("Times New Roman", 

   FontWeight.NORMAL, FontPosture.REGULAR, 24); 

   text.setFont(fontNormal); 

 

   VBox paneForCheckBoxes = new VBox(20); 

   paneForCheckBoxes.setPadding(new Insets(5, 5, 5, 5)); 

   paneForCheckBoxes.setStyle("-fx-border-color: green"); 

   CheckBox chkBold = new CheckBox("Bold"); 

 167 

 

28 

29 

 

30 

31 

32 

33 

34 

35 

36 

37 

38 

39 

40 

41 

42 

43 

44 

 

45 

46 

47 

48 

49 

50 

51 

   CheckBox chkItalic = new CheckBox("Italic"); 

   paneForCheckBoxes.getChildren().addAll(chkBold,  

chkItalic); 

   pane.setRight(paneForCheckBoxes); 

 

   EventHandler<ActionEvent> handler = e -> { 

   if (chkBold.isSelected() && chkItalic.isSelected()) { 

     text.setFont(fontBoldItalic);   

   } 

   else if (chkBold.isSelected()) { 

     text.setFont(fontBold);  

   } 

   else if (chkItalic.isSelected()) { 

     text.setFont(fontItalic);  

   } 

   else { 

     text.setFont(fontNormal);    } 

   }; 

   chkBold.setOnAction(handler); 

   chkItalic.setOnAction(handler); 

   return pane;  

  } 

  public static void main(String[] args) { 

  launch(args); 

  } 

Output 

 

 168 

 

11.11.4 RadioButton 

Radio button dikenal juga sebagai  option buttons,  digunakan untuk memilih single item dari 

sekelompok item yang ada. 

Tabel 11.6 Konstruktor dan deskripsi RadioButton 

Constructor Deskripsi 

RadioButton() Membuat RadioButton kosong 

RadioButton(text: String) Membuat RadioButton dengan suatu teks  

 

RadioButton rbUS = new RadioButton("US"); 

rbUS.setGraphic(new ImageView("image/usIcon.gif")); 

rbUS.setTextFill(Color.GREEN); 

rbUS.setContentDisplay(ContentDisplay.LEFT); 

rbUS.setStyle("−fx−border−color: black"); 

rbUS.setSelected(true); 

rbUS.setPadding(new Insets(5, 5, 5, 5)); 

 

mengelompokkan radio button 

 

ToggleGroup group = new ToggleGroup(); 

rbRed.setToggleGroup(group); 

rbGreen.setToggleGroup(group); 

rbBlue.setToggleGroup(group); 

 

Kode 11.21 RadioButtonDemo.java 

import javafx.geometry.Insets; 

import javafx.scene.control.RadioButton; 

import javafx.scene.control.ToggleGroup; 

import javafx.scene.layout.BorderPane; 

import javafx.scene.layout.VBox; 

import javafx.scene.paint.Color; 

 169 

 

10 

11 

12 

13 

14 

15 

16 

17 

18 

19 

 

20 

21 

22 

23 

24 

25 

26 

27 

28 

29 

30 

31 

32 

33 

34 

35 

36 

37 

public class RadioButtonDemo extends CheckBoxDemo { 

  @Override  

  protected BorderPane getPane() { 

   BorderPane pane = super.getPane(); 

   VBox paneForRadioButtons = new VBox(20); 

   paneForRadioButtons.setPadding(new Insets(5, 5, 5, 5)); 

   paneForRadioButtons.setStyle 

   ("−fx−border−width: 2px; -fx-border-color: green"); 

 

   RadioButton rbRed = new RadioButton("Red"); 

   RadioButton rbGreen = new RadioButton("Green"); 

   RadioButton rbBlue = new RadioButton("Blue"); 

   paneForRadioButtons.getChildren().addAll(rbRed, rbGreen,  

rbBlue); 

   pane.setLeft(paneForRadioButtons); 

 

   ToggleGroup group = new ToggleGroup(); 

   rbRed.setToggleGroup(group); 

   rbGreen.setToggleGroup(group); 

   rbBlue.setToggleGroup(group); 

 

   rbRed.setOnAction(e -> { 

   if (rbRed.isSelected()) { 

   text.setFill(Color.RED); 

   } 

   }); 

 

   rbGreen.setOnAction(e -> { 

   if (rbGreen.isSelected()) { 

   text.setFill(Color.GREEN); 

   } 

   }); 

 170 

 

38 

39 

40 

41 

42 

43 

44 

45 

46 

47 

48 

49 

50 

 

   rbBlue.setOnAction(e -> { 

   if (rbBlue.isSelected()) { 

   text.setFill(Color.BLUE); 

   } 

   }); 

   return pane; 

   } 

 

 public static void main(String[] args) { 

  launch(args); 

 } 

Output 

 

 

11.11.5 TextField 

Text field digunakan untuk memasukkan/menampilkan teks. Contoh penggunaan textfield: 

TextField tfMessage = new TextField("T-Storm"); 

tfMessage.setEditable(false); 

tfMessage.setStyle("−fx−text−fill: red"); 

tfMessage.setFont(Font.font("Times", 20)); 

tfMessage.setAlignment(Pos.BASELINE_RIGHT); 

Kode 11.22 TextFieldDemo.java 

import javafx.geometry.Insets; 

import javafx.geometry.Pos; 

import javafx.scene.control.Label; 

 171 

 

10 

11 

12 

13 

14 

 

15 

16 

17 

18 

19 

20 

21 

22 

23 

24 

25 

26 

27 

28 

import javafx.scene.control.TextField; 

import javafx.scene.layout.BorderPane; 

public class TextFieldDemo extends RadioButtonDemo { 

 @Override  

 protected BorderPane getPane() { 

  BorderPane pane = super.getPane(); 

 

  BorderPane paneForTextField = new BorderPane(); 

  paneForTextField.setPadding(new Insets(5, 5, 5, 5)); 

  paneForTextField.setStyle("-fx-border-color: green"); 

  paneForTextField.setLeft(new Label("Enter a new message:  

")); 

 

  TextField tf = new TextField(); 

  tf.setAlignment(Pos.BOTTOM_RIGHT); 

  paneForTextField.setCenter(tf); 

  pane.setTop(paneForTextField); 

 

  tf.setOnAction(e -> text.setText(tf.getText())); 

 

  return pane; 

 } 

 public static void main(String[] args) { 

  launch(args); 

 } 

 } 

Output 

 

 172 

 

 

11.11.6 TextArea 

TextArea digunakan untuk mengisikan teks panjang multiline. Contoh: 

TextArea taNote = new TextArea(“This is a text area”); 

taNote.setPrefColumnCount(20); 

taNote.setPrefRowCount(5); 

taNote.setWrapText(true); 

taNote.setStyle(“-fx-text-fill: red”); 

taNote.setFont(Font.font(“Times”, 20)); 

 

Kode 11.23 DescriptionPane.java 

10 

11 

12 

13 

14 

15 

 

16 

17 

18 

19 

import javafx.geometry.Insets; 

import javafx.scene.control.Label; 

import javafx.scene.control.ContentDisplay; 

import javafx.scene.control.ScrollPane; 

import javafx.scene.control.TextArea; 

import javafx.scene.image.ImageView; 

import javafx.scene.layout.BorderPane; 

import javafx.scene.text.Font; 

public class DescriptionPane extends BorderPane { 

  /** Label utk menampilkan image dan title */ 

  private Label lblImageTitle = new Label(); 

  /** Text area utk menampilkan text */ 

  private TextArea taDescription = new TextArea(); 

  public DescriptionPane() { 

   // tengahkan icon dan teks dan menempatkan teks dibawah  

icon 

   lblImageTitle.setContentDisplay(ContentDisplay.TOP); 

   lblImageTitle.setPrefSize(200, 100); 

 

   // Set font pada label dan text field 

 173 

 

20 

21 

22 

23 

24 

25 

26 

27 

28 

29 

 

30 

31 

32 

33 

34 

35 

36 

37 

38 

39 

40 

41 

42 

43 

44 

 

45 

46 

47 

48 

49 

   lblImageTitle.setFont(new Font("SansSerif", 16)); 

   taDescription.setFont(new Font("Serif", 14)); 

 

   taDescription.setWrapText(true); 

   taDescription.setEditable(false); 

 

   // buat scroll pane utk text area 

   ScrollPane scrollPane = new ScrollPane(taDescription); 

 

   // tempatkan  label dan  scroll pane dalam  border pane 

   setLeft(lblImageTitle); 

   setCenter(scrollPane); 

   setPadding(new Insets(5, 5, 5, 5)); 

  } 

 

  /** Set title */ 

  public void setTitle(String title) { 

  lblImageTitle.setText(title); 

  } 

 

  /** Set image view */ 

  public void setImageView(ImageView icon) { 

  lblImageTitle.setGraphic(icon);   

  //ina.setPreserveRatio(true); 

  //ina.setFitWidth(250);   

  } 

 

  /** Set text description */ 

  public void setDescription(String text) { 

  taDescription.setText(text); 

  } 

 174 

 

Kode 11.24 TextAreaDemo.java 

10 

11 

12 

13 

14 

15 

 

16 

17 

18 

19 

20 

21 

22 

import javafx.application.Application; 

import javafx.stage.Stage; 

import javafx.scene.Scene; 

import javafx.scene.image.ImageView; 

 

public class TextAreaDemo extends Application { 

 @Override  

 public void start(Stage primaryStage) { 

  // membuat  description pane 

  DescriptionPane descriptionPane = new DescriptionPane(); 

  // Set title, text, and image in the description pane 

  descriptionPane.setTitle("Indonesia"); 

  String description = "Bendera Merah Putih ... "; 

  descriptionPane.setImageView(new  

ImageView("image/benderaIna2.png")); 

  descriptionPane.setDescription(description); 

  // buat scene dan letakkan pada stage 

  Scene scene = new Scene(descriptionPane, 500, 300); 

  primaryStage.setTitle("TextAreaDemo");  

  primaryStage.setScene(scene);  

  primaryStage.show();  

 } 

Ouput 

 

 

 175 

 

11.11.7 ComboBox 

Combo box atau daftar pilihan atau drop-down list berisi daftar item yang dapat dipilih oleh 

user.Contoh: 

ComboBox<String> cbo = new ComboBox<>(); 

cbo.getItems().addAll("Item 1", "Item 2","Item 3", "Item 4"); 

cbo.setStyle("−fx−color: red"); 

cbo.setValue("Item 1"); 

 

Kode 11.25 ComboBoxDemo.java 

10 

11 

12 

13 

 

14 

15 

 

16 

17 

18 

19 

20 

21 

import javafx.application.Application; 

import javafx.stage.Stage; 

import javafx.collections.FXCollections; 

import javafx.collections.ObservableList; 

import javafx.scene.Scene; 

import javafx.scene.control.ComboBox; 

import javafx.scene.control.Label; 

import javafx.scene.image.ImageView; 

import javafx.scene.layout.BorderPane; 

 

public class ComboBoxDemo extends Application { 

 // deklarasi array Strings utk judul bendera 

 private String[] flagTitles = {"Indonesia", "Kamboja", "Malasya", 

 "Philipina", "Singapur", "Thailand", "Vietnam"}; 

 // deklarasi array ImageView  utk bendera 9 negara 

private ImageView[] flagImage = {new  

ImageView("image/benderaIna2.png"), 

 new ImageView("image/benderaKamb.jpg"), 

 new ImageView("image/benderaMalasya.png"), 

 new ImageView("image/benderaphil.jpg"), 

 new ImageView("image/benderaSing.jpg"), 

 new ImageView("image/benderathai.jpg"), 

 new ImageView("image/benderaViet.jpg") 

 176 

 

22 

23 

24 

25 

26 

27 

28 

29 

 

30 

31 

32 

33 

34 

35 

36 

37 

38 

39 

40 

 

41 

42 

43 

44 

45 

46 

47 

48 

49 

50 

 

 }; 

 

 private String[] flagDescription = new String[7]; 

 private DescriptionPane descriptionPane = new DescriptionPane(); 

 // buat combo box utk memilih negara 

 private ComboBox<String> cbo = new ComboBox<>();  

  @Override  

  public void start(Stage primaryStage) { 

   // Set text description 

   flagDescription[0] = "Bendera Indonesia ... "; 

   flagDescription[1] = "Description for Kamboja ... "; 

   flagDescription[2] = "Description for Malasya ... "; 

   flagDescription[3] = "Description for Philipina ... "; 

   flagDescription[4] = "Description for singapura ... "; 

   flagDescription[5] = "Description for Thailand  ... "; 

   flagDescription[6] = "Description for Vietnam ... "; 

   // Set the first country (Ina) for display 

   setDisplay(0); 

 

   //tambahkan combo box dan description pane pada border  

pane 

   BorderPane pane = new BorderPane(); 

 

   BorderPane paneForComboBox = new BorderPane(); 

   paneForComboBox.setLeft(new Label("pilih negara: ")); 

   paneForComboBox.setCenter(cbo); 

   pane.setTop(paneForComboBox); 

   cbo.setPrefWidth(400); 

   cbo.setValue("Indonesia"); 

 

   ObservableList<String> items = 

FXCollections.observableArrayList(flagTitles); 

 177 

 

51 

52 

53 

54 

55 

 

56 

57 

58 

59 

60 

61 

62 

63 

64 

65 

66 

67 

68 

69 

70 

   cbo.getItems().addAll(items); 

   pane.setCenter(descriptionPane); 

 

   // tampilkan negara terpilih 

   cbo.setOnAction(e ->  

setDisplay(items.indexOf(cbo.getValue()))); 

 

   // buat scene dan letakkan pada stage 

   Scene scene = new Scene(pane, 550, 270); 

   primaryStage.setTitle("ComboBoxDemo");  

   primaryStage.setScene(scene);  

   primaryStage.show();  

 } 

 

 /** Set display informasi  pada  description pane */ 

  public void setDisplay(int index) { 

   descriptionPane.setTitle(flagTitles[index]); 

   descriptionPane.setImageView(flagImage[index]); 

   descriptionPane.setDescription(flagDescription[index]); 

  } 

Output 

 

 

11.11.8 ListView 

ListView merupakan kontrol yang pada dasarnya sama dengan combobox namun 

membolehkan user untuk memilih sebuah item ataupun beberapa item. Contoh: 

 178 

 

ObservableList<String> items = FXCollections.observableArrayList("Item 1", "Item 2","Item 

3", "Item 4", "Item 5", "Item 6"); 

ListView<String> lv = new ListView<>(items); 

lv.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE); 

// menambahkan suatu listener pada property untuk menangani perubahan nilai pada properti: 

lv.getSelectionModel().selectedItemProperty().addListener(ov -> { 

System.out.println("Selected indices: " + lv.getSelectionModel().getSelectedIndices()); 

          System.out.println("Selected items: "+ lv.getSelectionModel().getSelectedItems()); 

         }); 

 

Kode 11.26 ListViewDemo.java 

10 

11 

12 

13 

14 

 

15 

16 

17 

18 

19 

20 

import javafx.application.Application; 

import javafx.stage.Stage; 

import javafx.collections.FXCollections; 

import javafx.scene.Scene; 

import javafx.scene.control.ListView; 

import javafx.scene.control.ScrollPane; 

import javafx.scene.control.SelectionMode; 

import javafx.scene.image.ImageView; 

import javafx.scene.layout.BorderPane; 

import javafx.scene.layout.FlowPane; 

 

 public class ListViewDemo extends Application { 

   

 private String[] flagTitles = {"Indonesia", "Kamboja",  

"Malasya", "Philipina", "Singapur", "Thailand", "Vietnam"}; 

   

 private ImageView [] flagImage = { 

  new ImageView("image/benderaIna2.png"), 

  new ImageView("image/benderaKamb.jpg"), 

  new ImageView("image/benderaMalasya.png"), 

  new ImageView("image/benderaphil.jpg"), 

 179 

 

21 

22 

23 

24 

25 

26 

27 

28 

29 

30 

31 

32 

33 

34 

35 

36 

37 

38 

39 

40 

41 

42 

 

43 

44 

45 

46 

47 

48 

49 

  new ImageView("image/benderaSing.jpg"), 

  new ImageView("image/benderathai.jpg"), 

  new ImageView("image/benderaViet.jpg") 

  }; 

 

  @Override  

  public void start(Stage primaryStage) { 

   ListView<String> lv = new ListView<> 

   (FXCollections.observableArrayList(flagTitles)); 

   lv.setPrefSize(400, 400);   

     lv.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE); 

   // buat  pane utk  image views 

   FlowPane imagePane = new FlowPane(10, 10); 

   BorderPane pane = new BorderPane(); 

   pane.setLeft(new ScrollPane(lv)); 

   pane.setCenter(imagePane); 

  lv.getSelectionModel().selectedItemProperty().addListener( 

   ov -> { 

   imagePane.getChildren().clear(); 

   for (Integer i:  

lv.getSelectionModel().getSelectedIndices()) { 

   imagePane.getChildren().add(flagImage[i]); 

   } 

   }); 

   Scene scene = new Scene(pane, 850, 370); 

   primaryStage.setTitle("ListViewDemo");  

   primaryStage.setScene(scene);  

   primaryStage.show();  

  } 

 } 

Output 

 180 

 

 

 

11.11.9 ScrollBar 

ScrollBar merupakan control yang digunakan untuk memilih suatu range nilai. 

contoh: 

ScrollBar sb = new ScrollBar(); 

   sb.valueProperty().addListener(ov −> { 

   System.out.println("old value: " + oldVal); 

   System.out.println("new value: " + newVal); 

}); 

 

Kode 11.27 ScrollBarDemo.java 

10 

11 

12 

13 

import javafx.application.Application; 

import javafx.stage.Stage; 

import javafx.geometry.Orientation; 

import javafx.scene.Scene; 

import javafx.scene.control.ScrollBar; 

import javafx.scene.layout.BorderPane; 

import javafx.scene.layout.Pane; 

import javafx.scene.text.Text; 

public class ScrollBarDemo extends Application { 

 @Override  

  public void start(Stage primaryStage) { 

  Text text = new Text(20, 20, "JavaFX Programming"); 

 

 181 

 

14 

 

15 

16 

17 

18 

19 

20 

21 

22 

23 

24 

25 

 

 

26 

27 

 

 

28 

29 

30 

31 

32 

33 

  ScrollBar sbHorizontal = new ScrollBar(); 

  ScrollBar sbVertical = new ScrollBar(); 

  sbVertical.setOrientation(Orientation.VERTICAL); 

   

  Pane paneForText = new Pane(); 

  paneForText.getChildren().add(text); 

   

  BorderPane pane = new BorderPane(); 

  pane.setCenter(paneForText); 

  pane.setBottom(sbHorizontal); 

  pane.setRight(sbVertical); 

  // Listener utk  horizontal scroll bar value change 

  sbHorizontal.valueProperty().addListener(ov -> 

text.setX(sbHorizontal.getValue() * paneForText.getWidth() / 

sbHorizontal.getMax())); 

  // Listener utk  vertical scroll bar value change 

  sbVertical.valueProperty().addListener(ov -> 

text.setY(sbVertical.getValue() * paneForText.getHeight() / 

sbVertical.getMax())); 

  Scene scene = new Scene(pane, 450, 170); 

  primaryStage.setTitle("ScrollBarDemo");  

  primaryStage.setScene(scene);  

  primaryStage.show();  

 } 

Output 

 

 182 

 

 

11.11.20 Slider 

Slider sama dengan ScrollBar, namun Slider memiliki lebih banyak  properties dan memiliki lebih 

banyak variasi tampilan.Contoh: 

 

Slider slHorizontal = new Slider(); 

slHorizontal.setShowTickLabels(true); 

slHorizontal.setShowTickMarks(true); 

 

Kode 11. 28 SliderDemo.java 

10 

11 

12 

13 

14 

 

15 

16 

17 

18 

19 

20 

import javafx.application.Application; 

import javafx.stage.Stage; 

import javafx.geometry.Orientation; 

import javafx.scene.Scene; 

import javafx.scene.control.Slider; 

import javafx.scene.layout.BorderPane; 

import javafx.scene.layout.Pane; 

import javafx.scene.text.Text; 

 

public class SliderDemo extends Application { 

 @Override  

 public void start(Stage primaryStage) { 

  Text text = new Text(20, 20, "JavaFX Programming"); 

  Slider slHorizontal = new Slider(); 

  slHorizontal.setShowTickLabels(true); 

  slHorizontal.setShowTickMarks(true); 

 

  Slider slVertical = new Slider(); 

  slVertical.setOrientation(Orientation.VERTICAL); 

  slVertical.setShowTickLabels(true); 

  slVertical.setShowTickMarks(true); 

 183 

 

21 

22 

23 

24 

25 

26 

27 

28 

29 

30 

31 

32 

 

 

33 

 

 

34 

35 

36 

37 

38 

39 

40 

41 

  slVertical.setValue(100); 

  // buat sebuah teks dlm pane 

  Pane paneForText = new Pane(); 

  paneForText.getChildren().add(text); 

 

  // buat border pane utk text dan  scroll bars 

  BorderPane pane = new BorderPane(); 

  pane.setCenter(paneForText); 

  pane.setBottom(slHorizontal); 

  pane.setRight(slVertical); 

 

  slHorizontal.valueProperty().addListener(ov -> 

text.setX(slHorizontal.getValue() * paneForText.getWidth() 

/slHorizontal.getMax())); 

           slVertical.valueProperty().addListener(ov –> 

text.setY((slVertical.getMax()- 

slVertical.getValue())*paneForText.getHeight() /slVertical.getMax())); 

 

  // buat scene dan letakkan pada stage 

  Scene scene = new Scene(pane, 450, 170); 

  primaryStage.setTitle("SliderDemo");  

  primaryStage.setScene(scene);  

  primaryStage.show();  

 } 

Output 

 

 184 

 

BAB 12 KONSEP DATABASE DAN DBMS 

Sistem database sudah digunakan di banyak tempat,sebagai contoh kartu rencana studi 

mahasiswa ,nilai mahasiswa,pembayaran mahasiswa di simpan di dalam suatu database. 

Ketika belanja online pemesanan barang yang kita lakukan di simpan di dalam database. 

Sistem database tidak hanya menyimpan data saja, namun juga menyediakan akses terhadap 

data dalam melakukan update,manipulasi, dan analisis terhadap data. 

Sistem database terdiri dari data,software yang melakukan penyimpan dan manajemen data 

dalam suatu database, dan program aplikasi untuk menyajikam data dan membuat user dapat 

berinteraksi menggunakan sistem database. 

 

Gambar 21.1 Sistem database terdiri dari data, DBMS dan program aplikasi. 

Database merupakan tempat penyimpan data(gudang data) yang menghasilkan informasi. 

Contoh Sistem database diataranya adalah MySQL, Oracle,IBM's DB2,Informix, MS-SQL 

Server,SQLLite, Sybase. Ketika kita membeli suatu sistem database dari vendor, pada 

dasarnya kita membeli software DBMS.DBMS dibuat untuk digunakan oleh programmer 

profesional dan tidak ditujukan untuk pemakai biasa. namun pemakai dapat menggunakan 

suatu program aplikasi yang dibuat di atas DBMS, sehingga program aplikasi merupakan 

interface yang menghubungkan antara pemakai biasa dan sistem database.Bentuk program 

aplikasi dapat berupa aplikasi GUI desktop atau aplikasi web. 

 185 

 

 

Gambar 12.2 Program aplikasi dapat mengkases banyak DBMS 

12.1 Model data relasional 

Saat ini sistem database yang banyak digunakan adalah sistem database relational, yang 

berbasis pada model data relasional, yang memiliki tiga komponen yaitu 

struktur,integritas,dan bahasa. struktur mewakili bentuk dari data,integritas menentukan 

batasan-batasan pada data,dan bahasa menyediakan akses dan manipulasi thd data. 

 

Gambar 12.3 Suatu table memiliki nama table, nama kolom dan baris 

 

Gambar 12.4 tabel student menyimpan informasi  tentang student 

 186 

 

 

Gambar 12.5 Tabel Enrollment menyimpan informasi tentang Enrollment dari student. 

Integritas (integrity constraint) merupakan kondisi legal pada suatu tabel yang harus 

dipenuhi, dimana ada tiga jenis constraint yaitu:domain constraint,primary key 

constraint,foreign key constraint. 

 

12.2 SQL 

SQL merupakan bahasa untuk mengakses sistem database relasional.program aplikasi harus 

menggunakan SQL untuk dapat mengakses database. create,drop table,retrieve,modifikasi 

data. MySQL  adalah salah satu software DBMS, untuk memasang MySQL pada komputer 

kita , kita dapat menggunakan XAMPP , yang merupakan software aplikasi gratis untuk 

aplikasi database mysql,web server, dan mail server. 

 

 

 

 

 

Gambar 12.6 Tampilan aplikasi XAMPP 

 

 

 187 

 

Lokasi file mysql pada folder xampp  

 

 

 

 

 

 

Gambar 12.7 Folder xampp 

12.3 Mengakses dan memanipulasi database 

Menggunakan commandtext untuk mengakses mysql, untuk login ke dalam database 

menggunakan perintah: 

D:\xampp\mysql\bin\Mysql  –root –p 

(password dikosongkan kemudian enter) 

 

 

 

 

Gambar 12.8 Comman text windows untuk mengakses database MySQL 

Berikut beberapa perintah sql untuk akses dan manipulasi database  :  

show databases; untuk melihat daftar databse, 

use dbjava; untuk masuk ke dalam database  “dbjava”  

show tables;  untuk melihat daftar table, 

select * from tbmhs;  untuk melihat isi dari tabel “tbmhs”.  

insert into tbmhs (idmhs, nim, nama, kota_asal) values (1, 

’A11.2017.00001’, ’BUDI’, ’SEMARANG’); untuk mengisikan record baru ke 

dalam tabel tbmhs. 

 188 

 

Eksekusi query menggunakan command text: 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Gambar 12.9 Eksekusi query menggunakan command text 

Menggunakan aplikasi GUI untuk mengakses MySQL 

SQLYog merupakan program aplikasi mode GUI untuk me-manage database mysql dimana 

untuk memanage database akan lebih mudah menggunakan aplikasi ini dibandingkan dengan 

command text. 

Mengeksekusi  query  pada SQLYog. 

 189 

 

Gambar 12.10 eksekusi query membuat user,membuat database,membuat table,mengisi data 

pada tabel,dan menampilkan isi tabeL. 

 190 

 

 

BAB 13 APLIKASI CRUD DENGAN JDBC 

JDBC merupakan API java untuk membuat aplikasi database.Dengan menggunakan API 

JDBC  suatu aplikasi dapat mengeksekusi query SQL,menampilkan hasil, dan menyajikan 

data ke dalam bentuk yang user-friendly. 

 

Gambar 13.1 Program Java yang mengakses dan memanipulasi database menggunakan JDBC 

Driver 

13.1 Membuat aplikasi database menggunakan JDBC 

Kunci utama membuat aplikasi database adalah Connection,Statement, dan Resultset. 

 

Gambar 13.2 Class-class JDBC membuat program dapat terkoneksi dengan database, 

mengirim statement SQL dan memproses result/hasil. 

 191 

 

13.2 Koneksi ke database 

Untuk membuat koneksi ke database menggunakan method getConnection pada class 

Connetion. 

Connection cn=DriverManager.getConnection(url,user,password); Pada method  

getConnection harus ditentukan url yang berupa nama jdbc drivier, lokasi server,dan nama 

database serta userdan password. 

Contoh: 

Connection cn = 

DriverManager.getConnection("jdbc:mysql://localhost/dbjava","nina","123"); 

 

13.3 Membuat statement 

Statement digunakan untuk memanipulasi data dengan membuat perintah SQL, kemudian 

melakukan eksekusi. Ada dua interface statement yaitu, Statement dan PreparedStatement. 

Interface Statement digunakan untuk eksekusi terhadap  statement sql yang bersifat static, 

sementara Preparestatement merupakan extends dari Statement, yang digunakan untuk 

eksekusi statement sql  secara dinamis(precompile) yaitu  dengan  parameter(atau tanpa 

parameter), penggunaan PrepareStatement  lebih efisien utk eksekusi yg berulang. 

Contoh perintah sql menggunakan interface Statetement. 

 Statement st = cn.createStatement();         

String sql = "insert into tbmhs(idmhs, nim, nama, kota_asal) values (3, 

'A11.2017.00003', 'BUDI', 'SALATIGA')"; 

st.executeUpdate(sql); 

 

Contoh perintah sql menggunakan Preparedstatetement. 

Connection cn=MySQLDB.getConnection(); 

String sql="insert into tbmhs(idmhs,nim,nama,kota_asal) values (?,?,?,?)";  

PreparedStatement pst = cn.prepareStatement(sql); 

pst.setInt(1,7); 

pst.setString(2,"A11.2018.90001"); 

 192 

 

pst.setString(3,"UMAR"); 

pst.setString(4,"SEMARANG"); 

pst.executeUpdate(); 

System.out.println("Insert berhasil ...");     

  

13.4 Memproses ResultSet 

Resultset menampung tabel yang sedang diakses, dimana posisi  awal baris berada di posisi 

null. Sedangkan untuk berpindah ke baris berikutnya menggunakan method next. Contoh 

memproses resulset: 

            

cn=DriverManager.getConnection("jdbc:mysql://localhost/dbjava","nina","123

"); 

System.out.println("Koneksi Berhasil");         

//membuat statement 

Statement st = cn.createStatement(); 

String sql="select * from tbmhs";             

ResultSet rs = st.executeQuery(sql);                                                                                                                    

rs.beforeFirst(); 

while (rs.next()){ 

     System.out.println(rs.getString(1)); 

13.5 Contoh Aplikasi CRUD 

Contoh program koneksi 

Kode 13.1 MySQLDB.java 

 

import java.sql.*; 

public class MySQLDB { 

   static Connection cn ; 

   public static Connection getConnection(){ 

         try{ 

 cn =  

DriverManager.getConnection("jdbc:mysql://localhost/dbjava", "nina",  

 193 

 

 

10 

11 

12 

13 

14 

15 

16 

"123"); 

 System.out.println("Koneksi berhasil");     

         }catch(SQLException se){ 

   se.printStackTrace(); 

             } 

           return cn; 

       } 

    public static void main(String[] args){ 

 MySQLDB.getConnection(); 

   } 

Output 

 

 

Contoh program dengan statement insert,update,delete 

Kode 13.2 MySQLDB.java 

 

 

10 

import java.sql.*; 

public class MySQLDB { 

 static Connection cn ; 

 public static Connection getConnection(){ 

    if (cn==null){ 

        try{ 

          cn =  

DriverManager.getConnection("jdbc:mysql://localhost/dbjava", "nina",  

"123"); 

         System.out.println("Koneksi berhasil");    

       }catch(SQLException se){ 

 se.printStackTrace(); }     

 194 

 

11 

12 

13 

14 

       } 

         return cn; 

    } 

Kode 13.3 TestDB.java 

10 

11 

12 

13 

14 

15 

16 

17 

18 

 

19 

20 

21 

22 

23 

24 

25 

26 

import javafx.application.Application; 

import javafx.stage.Stage; 

import javafx.scene.Scene; 

import javafx.scene.layout.HBox; 

import javafx.scene.control.Button; 

import java.sql.*; 

public class TestDB extends Application { 

 @Override 

 public void start(Stage s){ 

    HBox hb= new HBox(); 

    Button btInsert = new Button("Insert"); 

     Button btUpdate = new Button("Update"); 

     Button btDel = new Button("Delete"); 

     btInsert.setOnAction(e->{ 

         try{ 

             Connection cn=MySQLDB.getConnection(); 

             Statement st = cn.createStatement(); 

             String sql="insert into tbmhs(idmhs, nim, nama,  

kota_asal) values ('6','A11.2017.10111','ARI','KUDUS')";  

              st.executeUpdate(sql); 

              System.out.println("Insert berhasil ...");  

                     }catch(SQLException se){ 

                   se.printStackTrace(); 

               } 

         }); 

 btUpdate.setOnAction(e->{ 

 

 195 

 

27 

28 

29 

30 

 

31 

32 

33 

34 

35 

36 

37 

38 

39 

40 

41 

42 

43 

44 

45 

46 

47 

48 

49 

50 

51 

52 

53 

          try{ 

           Connection cn=MySQLDB.getConnection(); 

            Statement st = cn.createStatement(); 

            String sql="Update tbmhs set nama='HERU' where  

idmhs=1";  

            st.executeUpdate(sql); 

             System.out.println("UPDATE berhasil ...");   

       }catch(SQLException se){ 

  se.printStackTrace();  } 

    });    

 btDel.setOnAction(e->{ 

      try{ 

  Connection cn=MySQLDB.getConnection(); 

  Statement st = cn.createStatement(); 

  String sql="delete from  tbmhs where idmhs=7";  

  st.executeUpdate(sql); 

  System.out.println("Delete berhasil ...");   

  }catch(SQLException se){ 

   se.printStackTrace(); 

   } 

 });    

 hb.getChildren().addAll(btInsert,btUpdate,btDel); 

 Scene sc = new Scene(hb,300,200); 

 s.setTitle("Test Database"); 

 s.setScene(sc); 

 s.show(); 

        } 

Output 

 

 

 

 196 

 

 

Contoh program dengan PreparedStatement insert,update,delete 

Kode 13.4 TestDB2.java 

10 

11 

12 

13 

14 

15 

16 

17 

 

18 

19 

20 

21 

22 

23 

24 

25 

26 

27 

import javafx.application.Application; 

import javafx.stage.Stage; 

import javafx.scene.Scene; 

import javafx.scene.layout.HBox; 

import javafx.scene.control.Button; 

import java.sql.*; 

public class TestDB2 extends Application { 

  @Override 

  public void start(Stage s){ 

 HBox hb= new HBox(); 

 Button btInsert = new Button("Insert"); 

 Button btUpdate = new Button("Update"); 

 Button btDel = new Button("Delete"); 

 btInsert.setOnAction(e->{ 

   try{ 

     Connection cn=MySQLDB.getConnection(); 

     String sql="insert into tbmhs(idmhs,nim,nama,kota_asal)  

values (?,?,?,?)";  

     PreparedStatement pst = cn.prepareStatement(sql); 

      pst.setInt(1,7); 

     pst.setString(2,"A11.2018.90001"); 

     pst.setString(3,"UMAR"); 

     pst.setString(4,"SEMARANG"); 

     pst.executeUpdate() 

         System.out.println("Insert berhasil ...");   

    }catch(SQLException se){ 

       se.printStackTrace(); 

   } 

 197 

 

28 

29 

30 

31 

32 

33 

34 

35 

36 

37 

38 

39 

40 

41 

42 

43 

44 

45 

46 

47 

48 

49 

50 

51 

52 

53 

54 

55 

56 

57 

58 

59 

 }); 

 btUpdate.setOnAction(e->{ 

    try{ 

      Connection cn=MySQLDB.getConnection(); 

      String sql="Update tbmhs set nama='HERU' where idmhs=?"; 

           PreparedStatement pst = cn.prepareStatement(sql);  

      pst.setInt(1,1);      

      pst.executeUpdate(); 

     System.out.println("Update berhasil ...");    

     }catch(SQLException se){ 

    se.printStackTrace(); 

   } 

    });    

 btDel.setOnAction(e->{ 

    try{ 

      Connection cn=MySQLDB.getConnection();   

      String sql="delete from  tbmhs where idmhs=?";  

      PreparedStatement pst = cn.prepareStatement(sql); 

  

      pst.setInt(1,7);      

      pst.executeUpdate(); 

      System.out.println("Delete berhasil ...");   

    

      }catch(SQLException se){ 

  se.printStackTrace(); 

    } 

  });    

  hb.getChildren().addAll(btInsert,btUpdate,btDel); 

     Scene sc = new Scene(hb,300,200); 

  s.setTitle("Test Database"); 

  s.setScene(sc); 

  s.show(); 

 } 

 198 

 

60 } 

 

Memproses ResultSet dengan menampilkan di tabelview 

Kode 13. 5 MHS.java 

 

10 

11 

12 

13 

14 

15 

16 

17 

 

18 

19 

20 

21 

22 

23 

24 

25 

public class MHS { 

    private int idmhs; 

    private String nim; 

    private String nama; 

    private String kota_asal; 

 

    @Override 

    public String toString() { 

        return "MHSM{" + "idmhs=" + idmhs + ", nim=" + nim + ", nama="  

+ nama + ", kota_asal=" + kota_asal + '}'; 

    } 

    public MHS(){ 

    } 

    public int getIdmhs() { 

        return idmhs; 

    } 

    public void setIdmhs(int idmhs) { 

        this.idmhs = idmhs; 

    } 

    public String getNim() { 

        return nim; 

    } 

 

    public void setNim(String nim) { 

        this.nim = nim; 

    } 

 

 199 

 

26 

27 

28 

29 

30 

31 

32 

33 

34 

35 

36 

37 

38 

39 

40 

41 

    public String getNama() { 

        return nama; 

    } 

 

    public void setNama(String nama) { 

        this.nama = nama; 

    } 

 

    public String getKota_asal() { 

        return kota_asal; 

    } 

 

    public void setKota_asal(String kota_asal) { 

        this.kota_asal = kota_asal; 

    }     

Kode 13.6 TestDB3.java 

10 

11 

12 

13 

14 

15 

import javafx.application.Application; 

import javafx.stage.Stage; 

import javafx.scene.Scene; 

import javafx.scene.layout.HBox; 

import javafx.scene.control.TableView; 

import java.sql.*; 

import javafx.collections.FXCollections; 

import javafx.collections.ObservableList; 

import javafx.geometry.Pos; 

import javafx.scene.control.TableColumn; 

import javafx.scene.control.cell.PropertyValueFact 

 

public class TestDB3 extends Application { 

  @Override 

  public void start(Stage s){   

 200 

 

16 

17 

18 

19 

20 

21 

22 

23 

24 

25 

 

26 

 

27 

 

28 

 

29 

30 

 

31 

 

32 

 

33 

 

34 

35 

36 

37 

38 

 Scene sc = new Scene(getHBTabel(),600,400); 

 s.setTitle("Test Database"); 

 s.setScene(sc); 

 s.show();  

   } 

 public HBox getHBTabel(){ 

                   HBox hb= new HBox(); 

                   TableView<MHS> tbMHS = new TableView(); 

                   hb.getChildren().add(tbMHS); 

                  TableColumn<MHS,Integer> colIdmhs= new  

TableColumn("ID"); 

                  TableColumn<MHS,String> colNim=new  

TableColumn("NIM"); 

                  TableColumn<MHS,String> colNama=new  

TableColumn("Nama"); 

                  TableColumn<MHS,String> colKota_asal=new  

TableColumn("Kota Asal"); 

        

                  colIdmhs.setCellValueFactory(new  

PropertyValueFactory<>("idmhs")); 

                  colNim.setCellValueFactory(new  

PropertyValueFactory<>("nim")); 

                  colNama.setCellValueFactory(new  

PropertyValueFactory<>("nama")); 

                  colKota_asal.setCellValueFactory(new  

PropertyValueFactory<>("kota_asal")); 

                  

colIdmhs.prefWidthProperty().bind(tbMHS.widthProperty().divide(4)); 

                  

colNim.prefWidthProperty().bind(tbMHS.widthProperty().divide(4)); 

                  

colNama.prefWidthProperty().bind(tbMHS.widthProperty().divide(4)); 

          

 201 

 

39 

40 

41 

42 

43 

44 

45 

46 

47 

48 

49 

50 

51 

52 

53 

54 

55 

56 

57 

58 

59 

60 

61 

62 

63 

64 

colKota_asal.prefWidthProperty().bind(tbMHS.widthProperty().divide(4));   

              

tbMHS.getColumns().addAll(colIdmhs,colNim,colNama,colKota_asal); 

                  tbMHS.setItems(getAllMhs());       

      return hb; 

 }    

 public ObservableList<MHS> getAllMhs(){ 

         

ObservableList<MHS> lmhs= FXCollections.observableArrayList(); 

        try {        

            Statement st=MySQLDB.getConnection().createStatement(); 

            String sql="select * from tbmhs";           

            ResultSet rs=st.executeQuery(sql); 

            rs.beforeFirst(); 

            while(rs.next()){ 

                  MHS m = new MHS(); 

                  m.setIdmhs(Integer.parseInt(rs.getString(1))); 

                  m.setNim(rs.getString(2)); 

                  m.setNama(rs.getString(3)); 

                  m.setKota_asal(rs.getString(4)); 

                  lmhs.add(m); 

                  System.out.println(m); 

            }  

          } catch (SQLException ex) { 

              ex.printStackTrace();}               

          return lmhs; 

      }   

Output 

 

 202 

 

 

Metadata 

interface Connection membuat koneksi terhadap database, koneksi yang membuat statement 

sql dapat dieksekusi dan dapat menghasilkan data resultset. Connetion juga menyediakan 

akses informasi meta data dari sebuah database dimana informasi metadata itu  

menjelaskan kapabilitas dari suatu database diantaranya dukungan terhadap bentuk SQL,store 

procedure dll. 

Untuk membuat obyek dari Metadata sebuah database digunakan method getMetadata pada 

obyek koneksi. 

DatabaseMetaData dbMD = conn.getMetaData(); 

Contoh 

Kode 13.7 TestBMetaData 

 

 

 

 

 

10 

 

11 

 

import java.sql.*; 

public class TestBMetaData { 

        public static void main(String[] args) throws SQLException,  

ClassNotFoundException { 

              Connection connection =  

DriverManager.getConnection("jdbc:mysql://localhost/javadb", "root",  

""); 

  System.out.println("Database connected"); 

  DatabaseMetaData dbMetaData = connection.getMetaData(); 

  System.out.println("database URL: " + dbMetaData.getURL()); 

  System.out.println("database username: " + 

dbMetaData.getUserName()); 

  System.out.println("database product name: " + 

dbMetaData.getDatabaseProductName()); 

  System.out.println("database product version: " + 

dbMetaData.getDatabaseProductVersion()); 

  System.out.println("JDBC driver name: " + 

dbMetaData.getDriverName()); 

 203 

 

12 

 

13 

 

14 

 

15 

 

16 

 

17 

 

18 

19 

20 

  System.out.println("JDBC driver version: " + 

dbMetaData.getDriverVersion()); 

  System.out.println("JDBC driver major version: " + 

dbMetaData.getDriverMajorVersion()); 

  System.out.println("JDBC driver minor version: " + 

dbMetaData.getDriverMinorVersion()); 

  System.out.println("Max number of connections: " + 

dbMetaData.getMaxConnections()); 

  System.out.println("MaxTableNameLength: " + 

dbMetaData.getMaxTableNameLength()); 

  System.out.println("MaxColumnsInTable: " + 

dbMetaData.getMaxColumnsInTable()); 

  connection.close(); 

  } 

 

 

 

 

Kode 13.8 merupakan contoh penggunaan MetaData. 

Kode 13.8 TestRSMetaData.java 

import java.sql.*; 

 

 204 

 

 

 

 

10 

11 

 

12 

13 

 

14 

15 

16 

17 

 

18 

19 

 

20 

 

21 

22 

23 

24 

25 

26 

public class TestRSMetaData { 

     public static void main(String[] args) throws SQLException,  

ClassNotFoundException { 

        // Connect to a database 

          Connection connection =  

DriverManager.getConnection("jdbc:mysql://localhost/dbjava",  

"root", "");           

          System.out.println("Database connected"); 

        // Create a statement 

        Statement statement = connection.createStatement(); 

         // Execute a statement 

          ResultSet resultSet = statement.executeQuery("select *  

from tbmhs"); 

          

          ResultSetMetaData rsMetaData =  

resultSet.getMetaData(); 

          for (int i = 1; i <= rsMetaData.getColumnCount(); i++) 

 System.out.printf("%-12s\t", rsMetaData.getColumnName(i)); 

  System.out.println(); 

  // Iterate through the result and print the students'  

column 

  while (resultSet.next()) { 

  for (int i = 1; i <= rsMetaData.getColumnCount();  

i++) 

   System.out.printf("%-12s\t",  

resultSet.getObject(i)); 

   System.out.println(); 

   } 

   // Close the connection 

   connection.close(); 

  } 

 205 

 

Output 

 

 

Contoh Aplikasi menggunakan desain pattern MVC: 

 

 

 

 

 

 

 

 

 

 

 

Gambar 13.3 Hasil program 

 206 

 

Gambar 13.9 Project terdiri dari package controller, model dan view. 

Source code lengkap 

Package view 

Kode 13.9 AplikasJiFX5.java 

10 

11 

12 

13 

package aplikasijfx5.view; 

 

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.HBox; 

import javafx.scene.layout.StackPane; 

import javafx.stage.Stage; 

public class AplikasJiFX5 extends Application { 

     static PanelKiri pnKiri= new PanelKiri();  

     static PanelKanan pnKanan = new PanelKanan(); 

 207 

 

14 

15 

16 

17 

18 

 

19 

20 

21 

22 

23 

24 

25 

26 

27 

28 

29 

    @Override 

    public void start(Stage primaryStage) { 

        HBox hbMain = new HBox(10); 

       

pnKiri.prefWidthProperty().bind(hbMain.widthProperty().divide(3)); 

        pnKanan.prefWidthProperty().bind(hbMain. 

widthProperty().subtract(hbMain.widthProperty().divide(3))); 

        hbMain.getChildren().addAll(pnKiri,pnKanan); 

        Scene scene = new Scene(hbMain, 800, 600); 

         

        primaryStage.setTitle("Data MHS"); 

        primaryStage.setScene(scene); 

        primaryStage.show(); 

    } 

    public static void main(String[] args) { 

        launch(args); 

    }     

Kode 13.10 PanelKanan.java 

10 

11 

12 

13 

package aplikasijfx5.view; 

 

import aplikasijfx5.controller.MHSC; 

import aplikasijfx5.model.MHSM; 

import java.util.Optional; 

import javafx.geometry.Pos; 

import javafx.scene.control.Alert; 

import javafx.scene.control.Alert.AlertType; 

import javafx.scene.control.Button; 

import javafx.scene.control.ButtonType; 

import javafx.scene.control.TableColumn; 

import javafx.scene.control.TableView; 

import javafx.scene.control.TextField; 

 208 

 

14 

15 

16 

17 

18 

19 

20 

21 

22 

23 

24 

25 

26 

27 

28 

29 

30 

31 

32 

33 

34 

35 

36 

37 

38 

39 

40 

41 

42 

43 

44 

45 

import javafx.scene.control.cell.PropertyValueFactory; 

import javafx.scene.image.Image; 

import javafx.scene.image.ImageView; 

import javaf