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
1
2
3
4
5
6
7
8
9
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
1
2
3
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
131
4
5
6
7
8
9
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
1
2
3
4
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.stage.Stage;
132
5
6
7
8
9
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
1
2
3
4
5
6
7
8
9
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
1
2
3
4
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.stage.Stage;
135
5
6
7
8
9
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
1
2
3
4
5
6
7
8
9
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
1
2
3
4
5
6
7
8
9
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
1
2
3
4
5
6
7
8
9
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
1
2
3
4
5
6
7
8
9
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
1
2
3
4
5
6
7
8
9
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
1
2
3
4
5
6
7
8
9
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
1
2
3
4
5
6
7
8
9
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
1
2
3
4
5
6
public class Luar {
int varLuar;
void printLuar(){
System.out.println("cetak
luar");
}
class Dalam {
1
2
3
4
5
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
7
8
9
10
11
12
int varDalam;
void printDalam(){
System.out.println("cetak
dalam");
}
}
}
6
7
8
9
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
1
2
3
4
5
6
7
8
9
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
1
2
3
4
5
6
7
8
9
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
1
2
3
4
5
6
7
8
9
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
1
2
3
4
5
6
7
8
9
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
1
2
3
4
5
6
7
8
9
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
1
2
3
4
5
6
7
8
9
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
1
2
3
4
5
6
7
8
9
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
1
2
3
4
5
6
7
8
9
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
1
2
3
4
5
6
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
7
8
9
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
1
2
3
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.control.Label;
171
4
5
6
7
8
9
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
1
2
3
4
5
6
7
8
9
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
1
2
3
4
5
6
7
8
9
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
1
2
3
4
5
6
7
8
9
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
1
2
3
4
5
6
7
8
9
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
1
2
3
4
5
6
7
8
9
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
1
2
3
4
5
6
7
8
9
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
1
2
3
4
5
6
import java.sql.*;
public class MySQLDB {
static Connection cn ;
public static Connection getConnection(){
try{
cn =
DriverManager.getConnection("jdbc:mysql://localhost/dbjava", "nina",
193
7
8
9
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
1
2
3
4
5
6
7
8
9
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
1
2
3
4
5
6
7
8
9
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
1
2
3
4
5
6
7
8
9
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
1
2
3
4
5
6
7
8
9
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
1
2
3
4
5
6
7
8
9
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
1
2
3
4
5
6
7
8
9
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
1
2
import java.sql.*;
204
3
4
5
6
7
8
9
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
1
2
3
4
5
6
7
8
9
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
1
2
3
4
5
6
7
8
9
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