ikan inputan string padahal semestinya user 

memberikan input integer. Program tidak akan langsung terminate (berhenti) tetapi akan 

memunculkan pesan kesalahan input. Pesan kesalahan tersebut berasal dari blok catch.Kode 

10.1 merupakan contoh implementasi dari permisalan sebelumnya. 

Kode 10.1 AngkaError.java 

import java.util.Scanner; 

public class AngkaError 

 public static void main(String[] args) 

 { 

  // Buat objek Scanner 

  System.out.print("Masukkan sembarang angka: "); 

  Scanner input = new Scanner(System.in); 

  int angka; 

 120 

 

10 

11 

12 

13 

14 

15 

16 

17 

18 

19 

20 

   

  try{ 

   angka = input.nextInt(); 

   System.out.print("Angka yang dimasukkan: "+angka); 

  } 

  catch(Exception e) 

  { 

   System.out.print("Inputan salah!"); 

  } 

 } 

Output: 

Masukkan sembarang angka: 12 

Angka yang dimasukkan: 12 

 

Suatu program yang dapat mendeteksi error dapat dibuat dari instance dari tipe exception 

yang sesuai dan lemparkan (throw it). Sebagai contoh, ada  program meneruskan nilai 

dari suatu method dan argument harus berupa argument non-negative, tetapi malah argument 

negative. Program dapat dibuat dari instance IllegalArgumentException dan kemudian di 

throw seperti berikut: 

IllegalArgumentException ex = new IllegalArgumentException(“Argumen 

salah!”); 

Throw ex; 

atau 

throw new IllegalArgumentException(“Argumen salah!”); 

Block catch dapat lebih dari satu dan ada  tambahan blok untuk finally. Jika ingin 

beberapa kode dieksekusi terlepas dari apakah exception tersebut terjadi atau tertangkap kita 

dapat menggunakan finally. Finally juga dapat digunakan tanpa catch. Dari Kode 10.1 kita 

dapat menambahkan finnaly setelah block catch. 

 

 

 121 

 

finally 

 System.out.print("Terima kasih."); 

10.3 Pemrograman Generik 

Secara sederhana, pemrograman generik dalam hal ini Generic Type/ Tipe Generik 

merupakan class atau interface generik yang memperbolehkan semua jenis tipe data sebagai 

suatu parameter. Sebelumnya sudah di implementasi pada ArrayList dan Vector dengan 

simbol “<....>”. Berikut adalah contoh sederhana dari perbandian class biasa dengan class 

generik: 

Tabel 10.1 Perbandingan class biasa dengan generik 

Biasa Generik 

public class Box { 

    private int object; 

    public void set(int object) {  

 this.object = object;  

 } 

    public int get() {  

  return object;  

 } 

public class Box<T> { 

    private T t; 

    public void set(T t) {  

  this.t = t;  

 } 

    public T get() {  

  return t;  

 } 

 

Pada versi non-generic clas Box jika seandainya instance dari Box adalah Kotak dan 

Kotak.set(“50”), maka akan menghasilkan error. Error disebabkan hanya boleh diset oleh 

nilai integer saja. Pada versi generic dapat di set oleh berbagai tipe data, baik primitive 

maupun tipe data bentukan, dan bahkan array/list. Format class generic: 

class name<T1, T2, ..., Tn> { /* ... */ } 

Untuk instance dari class box versi generik, berikut caranya: 

Box<Integer> integerBox = new Box<Integer>(); 

Meskipun tipe data atau objek yang digenerik-kan dapat diberi nama dengan bebas, beberapa 

programmer memberikan standar sebagai berikut: 

 E - Elemen (sering digunakan di Java Collections Framework) 

 K - Kunci 

 122 

 

 N – Angka (number) 

 T - Tipe 

 V – Nilai (value) 

 S,U,V, dll 

Timbul pertanyaan, dalam satu class terkadang programmer menginginkan tidak hanya satu 

variabel atau properti yang akan di-generik-kan. Kode 10.2 memberikan contoh satu class 

memiliki dua tipe generik. 

Kode 10.2 OrderedPair.java 

10 

11 

12 

13 

14 

15 

16 

17 

18 

19 

20 

21 

 

22 

23 

public class OrderedPair<K, V> { 

    private K key; 

    private String value; 

    public OrderedPair(K key, V value) { 

  this.key = key; 

  this.value = (String)value; 

    } 

    public K getKey() {  

  return key;  

 } 

 public String getValue() 

 { 

  if(this.key == "aaa") 

   return this.value; 

  else 

   return "salah"; 

 } 

  

 public static void main(String[] args) 

 { 

  OrderedPair<String, String>  p2 = new OrderedPair<String, 

String>("aaa", "2"); 

  System.out.println(p2.getValue()); 

 

 123 

 

24 

25 

 } 

Output:  

 

Contoh lain dari generik tidak hanya pada class tetapi juga dapat diterapkan pada method 

secara langsung. Berikut adalah contoh method generic untuk menampilkan elemen array: 

public static < E > void printArray( E[] inputArray ) { 

      // Display array elements 

      for(E element : inputArray) { 

         System.out.printf(element+” ”); 

      } 

      System.out.println(); 

10.4 Design Pattern 

Design pattern merupakan istilah untuk merepresentasikan paktik penggunaan terbaik yang 

digunakan oleh programmer/pengembang software yang berpengalaman dalam pemrograman 

berorientasi objek. Menyediakan solusi untuk permasalahan umum dari 

programmer/pengembang software selama mengembangkan software. Solusi ini diperoleh 

dari trial & error yang dilakukan oleh programmer/pengembang perangkat lunak yang 

berpengalaman.  

10.5 Singleton Pattern 

Merupakan Design Pattern  paling sederhana yang memungkinkan untuk dapat diprogram 

dengan Java. Pola ini melibatkan satu Class tunggal yang bertanggung jawab untuk membuat 

sebuah objek tunggal yang akan tercipta. Class ini menyediakan cara untuk mengakses 

objeknya yang secara langsung dapat diakses tanpa harus melakukan instance objek dari 

Class. Class diagram untuk class singleton ini seperti pada Gambar 10.1. 

 124 

 

 

 

 

 

 

 

 

 

 

Gambar 10.1 Class Diagram Singleton 

Kode 10.3 merupakan contoh implementasi singleton patten untuk class SingleObject. 

Kode 10.3 SingleObject.java 

10 

11 

12 

13 

14 

15 

16 

public class SingleObject { 

  

 //buat static instance objek ini 

 private static SingleObject instance = new SingleObject(); 

 

 //buat konstruktor secara private sehingga  

 //tidak akan bisa di instance dengan cara biasa 

 private SingleObject(){} 

 

 //dapatkan instance 

 public static SingleObject getInstance(){ 

   return instance; 

 } 

  

 //tampilkan pesan 

 public void showMessage(){ 

 125 

 

17 

18 

19 

20 

21 

22 

23 

24 

   System.out.println("Hello World!"); 

 } 

 

 public static void main(String[] args) { 

  SingleObject object = SingleObject.getInstance(); 

  object.showMessage(); 

 } 

 

Pada main method tidak ada keyword untuk melakukan instance atau “new”. Objek langsung 

dibuat dan langsung dapat digunakan ketika memanggil method getInstance(). Dua baris 

kode didalam main dapat digantikan dengan kode dibawah ini: 

SingleObject.getInstance().showMessage(); 

Eksekusi dari kode tersebut akan menghasilkan output yang sama dengan dua baris kode 

sebelumnya. 

10.6 Model-View-Controller Pattern 

Model-View-Controller atau MVC adalah sebuah metode untuk membuat sebuah aplikasi 

dengan memisahkan data (Model) dari tampilan (View) dan cara bagaimana memprosesnya 

(Controller). Dalam implementasinya kebanyakan framework dalam aplikasi website adalah 

berbasis arsitektur MVC. MVC memisahkan pengembangan aplikasi berdasarkan komponen 

utama yang membangun sebuah aplikasi seperti manipulasi data, antarmuka pengguna, dan 

bagian yang menjadi kontrol dalam sebuah aplikasi. 

 126 

 

 

Gambar 10.2 Model View Controller (MVC) 

Pola MVC memiliki layer yang disebut dengan Model yang merepresentasikan data yang 

digunakan oleh aplikasi sebagaimana proses bisnis yang diasosiasikan terhadapnya. Dengan 

memilahnya sebagai bagian terpisah, seperti penampungan data, persistence, serta proses 

manipulasi, terpisah dari bagian lain aplikasi. ada  beberapa kelebihan dalam pendekatan 

ini. Pertama, membuat detail dari data dan operasinya dapat ditempatkan pada area yang 

ditentukan (Model) dibanding tersebar dalam keseluruhan lingkup aplikasi. Hal ini 

memberikan keuntungan dalam proses pemeliharaan aplikasi. Kedua, dengan pemisahan total 

antara data dengan implementasi interface, komponen model dapat digunakan kembali oleh 

aplikasi lain yang memiliki kegunaan yang hampir sama. 

Layer view mengandung keseluruhan detail dari implementasi user interface. Disini, 

komponen grafis menyediakan representasi proses internal aplikasi dan menuntun alur 

interaksi user terhadap aplikasi. Tidak ada layer lain yang berinteraksi dengan pengguna, 

hanya View. Penggunaan layer View memiliki beberapa kelebihan: memudahkan 

pengabungan divisi desain dalam development team. Divisi desain dapat berkonsentrasi pada 

style, look and feel, dan sebagainya, dalam aplikasi tanpa harus memperhatikan lebih pada 

detail yang lain. Dengan memiliki layer View yang terpisah memungkinkan ketersediaan 

multiple interface dalam aplikasi. Jika inti dari aplikasi terletak pada bagian lain (dalam 

 127 

 

Model), multiple interfaces dapat dibuat (Swing, Web, Console), secara keseluruhan 

memiliki tampilan yang berbeda namun mengeksekusi komponen Model sesuai 

fungsionalitas yang diharapkan. 

Terakhir, arsitektur MVC memiliki layer Controller. Layer ini menyediakan detail alur 

program dan transisi layer, dan juga bertanggungjawab akan penampungan events yang 

dibuat oleh user dari View dan melakukan update terhadap komponen Model menggunakan 

data yang dimasukkan oleh user. Kelebihan dalam penggunaan layer Controller secara 

terpisah adalah dengan menggunakan komponen terpisah untuk menampung detail dari 

transisi layer, komponen view dapat didesain tanpa harus memperhatikan bagian lain secara 

berlebih. Hal ini memudahkan team pengembang multiple interface bekerja secara terpisah 

dari yang lain secara simultan. Interaksi antar komponen View terabstraksi dalam Controller. 

Data Access Object (DAO) merupakan sebuah object yang menyediakan sebuah abstract 

interface terhadap beberapa database atau mekanisme persistence, menyediakan beberapa 

operasi tertentu tanpa mengekspos detail database. Penerapan konsep ini sering disebut 

dengan separation of concern dimana setiap kode dipisahkan berdasarkan fungsinya sehingga 

kode diatasnya hanya perlu mengetahui secara abstrak cara mengakses data tanpa perlu 

mengetahui bagaimana akses ke sumber data diimplementasikan. DAO sering dikaitkan 

dengan Java EE dan akses ke relational database melalu JDBC API, karena 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 permasalahan 

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 tersebut 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 tersebut 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 tersebut 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 tersebut. 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 tersebut. 

 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 

 

i