Saturday, December 16, 2017

Membuat Perintah SQL dengan FXML

  1. Buat Project FXML
  2. Edit berkas FXML
  3. Sesuaikan controller dengan berkas FXML
Berkas FXML yang saya buat adalah :
<?xml version="1.0" encoding="UTF-8"?>

<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.*?>
<?import javafx.geometry.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>

<AnchorPane xmlns:fx="http://javafx.com/fxml/1"
            id="anpMultipleControl"
            fx:controller="javafxml.FXMLDocumentController">
    <children>
        <VBox
            style="-fx-background-color: #9999bb;">
            <children>
                <HBox fx:id = "hbxName">
                    <padding><Insets top="10" bottom="5"/>
                     </padding>
                    <children>                     
                        <Label fx:id = "lblName" minWidth = "100" text = "Name"/>
                        <TextField fx:id = "txfName" minWidth = "200"/>                   
                    </children>               
                </HBox>
                <HBox fx:id = "hbxAddress">
                    <padding><Insets top="10" bottom="5"/>
                     </padding>
                    <children>
                        <Label fx:id = "lblAddress" minWidth = "100" text = "Address"/>
                        <TextField fx:id = "txfAddress" minWidth = "200"/>
                    </children>               
                </HBox>
                <HBox fx:id = "hbxButton" spacing = "100">
                     <padding><Insets top="10" bottom="5"/>
                     </padding>
                    <children>
                        <Button fx:id = "btnSave" text = "Save" minWidth="100"
                            onAction = "#handleButtonSave"/>
                        <Button fx:id = "btnCancel" text ="Cancel" minWidth="100"
                            style="-fx-background-color: #3399ff;"
                            onAction = "#handleButtonCancel" />                           
                    </children>               
                </HBox>
            </children>
        </VBox>
    </children>
</AnchorPane>

Selanjutnya controller disesuaikan dengan berkas FXML :
public class FXMLDocumentController implements Initializable {
    @FXML
    TextField txfName, txfAddress;
   
    @FXML
    private void handleButtonCancel(ActionEvent event) {
        txfName.setText("");
        txfAddress.setText("");
    }
   
    @FXML
    private void handleButtonSave(ActionEvent event) {
        String strSQL = "Insert into teman values('"+
                txfName.getText().toString()+"', '"+
                txfAddress.getText().toString()+"')";
        System .out.println(strSQL);
        txfName.setText("");
        txfAddress.setText("");
    }
   
    @Override
    public void initialize(URL url, ResourceBundle rb) {
   
    }   
   
}

perhatikanlah bahwa string sql diterbitkan oleh method :
@FXML
    private void handleButtonSave(ActionEvent event) {
        String strSQL = "Insert into teman values('"+
                txfName.getText().toString()+"', '"+
                txfAddress.getText().toString()+"')";
        System .out.println(strSQL);
        txfName.setText("");
        txfAddress.setText("");
    }


Yang terakhir adalah file aplikasi :

package javafxml;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;

/**
 *
 * @author LAB
 */
public class JavaFXML extends Application {
   
    @Override
    public void start(Stage stage) throws Exception {
        Parent root = FXMLLoader.load(getClass().getResource("FXMLDocument.fxml"));
       
        Scene scene = new Scene(root);
       
        stage.setScene(scene);
        stage.setTitle("Multiple Control");
        stage.show();
    }

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

Wednesday, December 13, 2017

Kontrol dengan javafx

Berikut ini adalah FXMLDocument.fxml

<?xml version="1.0" encoding="UTF-8"?>

<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.geometry.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>

<AnchorPane id="AnchorPane"  xmlns:fx="http://javafx.com/fxml/1" fx:controller="javafxmlcontrol.FXMLDocumentController">
    <children>
        <VBox fx:id="vbx" >
        <padding><Insets top="25" right="25" bottom="25" left="25"/></padding>
            <children>
                <HBox id = "hbxName">
                    <children>
                        <Label fx:id = "lblName" minWidth="100" text="Name"/>
                        <TextField fx:id = "txfName" minWidth="200"/>
                    </children>                   
                </HBox>
                <HBox id = "hbxAddress">
                    <padding><Insets top="5" />
                        </padding>
                    <children>
                        <Label fx:id = "lblAddress" minWidth="100" text="Alamat"/>
                        <TextField fx:id = "txfAddress" minWidth="200"/>
                    </children>                   
                </HBox>
                <HBox id = "hbxButton" spacing = "100">
                    <padding><Insets top="10" />
                        </padding>
                    <children>                       
                        <Button fx:id= "btnSave" minWidth="100"
                            text="Save"/>
                       
                        <Button fx:id= "btnCancel" minWidth="100"                           
                            text="Cancel"/>
                    </children>                   
                </HBox>               
            </children>
        </VBox>
    </children>
</AnchorPane>

Selanjutnya kita memiliki FXMLDocumentController.java :
/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package javafxmlcontrol;

import java.net.URL;
import java.util.ResourceBundle;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Label;


public class FXMLDocumentController implements Initializable {
   
   
    @Override
    public void initialize(URL url, ResourceBundle rb) {
        // TODO
       
    }   
   
}

Yang terakhir adalah file aplikasi :

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package javafxmlcontrol;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;


/**
 *
 * @author FASILKOM
 */
public class JavaFXMLControl extends Application {
   
    @Override
    public void start(Stage stage) throws Exception {
        Parent root = FXMLLoader.load(getClass().getResource("FXMLDocument.fxml"));
        Scene scene = new Scene(root);
        stage.setScene(scene);
        stage.setTitle("Control Exercise");
        stage.show();
    }

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




Saturday, June 10, 2017

Java FXML : Koneksi dengan DBMS-Derby

Pada bagian ini kita akan membuat aplikasi yang dapat menampilkan tabel dengan JavaFX.

  1. Yang penting untuk diperhatikan adalah : Definisi berkas *xml
  2. Membuat class sebagai enkapsulasi properti dari data yang ditampilkan
  3. Modifikasi class controller dari berkas fxml
  4. Semua program dihalaman ini dapat digunakan sesuai dengan lisensi GPL3
Definisi berkas xml : FXMLCustomer.xml

<?xml version="1.0" encoding="UTF-8"?>

<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.collections.FXCollections?>

<GridPane id="AnchorPane" 
          xmlns:fx="http://javafx.com/fxml/1" 
          fx:controller="fxmltableview.FXMLTableViewController">
    <TableView fx:id = "tbl1" >
        <columns>
            <TableColumn fx:id="tbc1" text="Name" minWidth="300" >
                <cellValueFactory>
                    <javafx.scene.control.cell.PropertyValueFactory 
                        property="sspName" />                    
                </cellValueFactory>
            </TableColumn> 
            <TableColumn fx:id="tbc2" text="Discount Code" minWidth="200" >
                <cellValueFactory>
                    <javafx.scene.control.cell.PropertyValueFactory 
                        property="sspDiscountCode" />                    
                </cellValueFactory>
            </TableColumn> 
        </columns>
        <items>
            <FXCollections fx:factory="observableArrayList">
            </FXCollections>
        </items>
    </TableView> 
</GridPane>

Membuat class untuk enkapsulasi properti : Customer.java
package fxmltableview;

import javafx.beans.property.SimpleStringProperty;

/**
 *
 * @author Joko adianto
 */
public class Customer {
    private final SimpleStringProperty sspName = new SimpleStringProperty("");
    private final SimpleStringProperty sspDiscountCode = new SimpleStringProperty("");
    public Customer(){
        this("","");
    }
    public Customer(String strName, String strDiscountCode){
        setSspName(strName);
        setSspDiscountCode(strDiscountCode);
    }
    
    public void setSspName(String strName){
        sspName.set(strName);
    }
    
    public String getSspName(){
        return sspName.get();
    }
    
    public void setSspDiscountCode(String strDiscountCode){
        sspDiscountCode.set(strDiscountCode);
    }
    
    public String getSspDiscountCode(){
        return sspDiscountCode.get();
    }
    
}

Membuat Class Controller : FXMLTableViewController.java
package fxmltableview;

import java.net.URL;
import java.util.ResourceBundle;
import javafx.collections.ObservableList;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.TableView;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Joko Adianto
 */
public class FXMLTableViewController implements Initializable {
    Connection con;
    Statement stm;
    ResultSet rst;
    
    @FXML
    private TableView<Customer> tbl1;
    
    @Override
    public void initialize(URL url, ResourceBundle rb) {
        // TODO
        ObservableList<Customer> customerList = tbl1.getItems();
        try {
            Class.forName("org.apache.derby.jdbc.ClientDriver");
            con = DriverManager.getConnection("jdbc:derby://localhost:1527/sample", 
                "app", "app");
            stm = con.createStatement();
            rst = stm.executeQuery("select * from Customer");
            while(rst.next()){
                customerList.add(new Customer(rst.getString("NAME"), 
                    rst.getString("DISCOUNT_CODE")));
            }
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(FXMLTableViewController.class.getName()).log(Level.SEVERE, null, ex);
        } catch (SQLException ex) {
            Logger.getLogger(FXMLTableViewController.class.getName()).log(Level.SEVERE, null, ex);
        }
    }    
    
}




Yang terakhir membuat class pemanggil : JavaFXApplication1.java
package fxmltableview;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;

/**
 *
 * @author Multimedia1_Pengawas
 */
public class JavaFXApplication1 extends Application {
    
    @Override
    public void start(Stage stage) throws Exception {
        try{
            Parent root = FXMLLoader.load(getClass().getResource("FXMLTableView.fxml"));
            Scene scene = new Scene(root);
            stage.setScene(scene);
            stage.setTitle("Table View : Joko Adianto");
            stage.show();
        }
        catch(Exception e){
            stage.setTitle(e.getMessage());
        }
    }

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

&&&&




Saturday, June 3, 2017

TextField Lanjutan : Menentukan Panjang Masukan TextField

Sekarang kita akan membuat TextField yang panjang masukannya ditentukan oleh programmer.

  1. Kita memiliki 3 buah TextField
  2. Kita menentukan panjang masukan yang dapat dituliskan
  3. Jika sudah mencapai panjang maksimal berpindah ke TextField berikutnya 
Jika sudah selesai melakukan eksplorasi buat program yang menentukan panjang textfield sesuai dengan panjang kolom didalam tabel yang tersimpan didalam database.

Sekarang kita akan melihat contoh program yang pertama :


/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package javafxtextfield;


import javafx.application.Application;
import javafx.event.Event;
import javafx.event.EventDispatchChain;
import javafx.event.EventDispatcher;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.TextField;
import javafx.scene.control.TextFormatter;
import javafx.scene.control.TextFormatter.Change;
import javafx.scene.control.TextInputControl;
import javafx.scene.input.KeyEvent;
import javafx.scene.layout.Background;
import javafx.scene.layout.Border;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.scene.text.Text;
import javafx.stage.Stage;
import javafx.util.StringConverter;

/**
 *
 * @author joko
 */
public class JavaFXTextField extends Application {
    TextField txf1 = new TextField();
    TextField txf2 = new TextField();
    TextField txf3 = new TextField();
    
    
    class ChangeHandler implements EventHandler{
        
        @Override
        public void handle(Event ev) {            
                if(txf1.getText().length()>10){
                    txf1.setText(txf1.getText(0, 10));     
                    txf2.requestFocus();
                }
                
                if(txf2.getText().length()>5){
                    txf2.setText(txf2.getText(0, 5));                    
                    txf3.requestFocus();
                }
                
                if(txf3.getText().length()>3){
                    txf3.setText(txf3.getText(0, 3));
                    txf1.requestFocus();
                }
                
        }
        
    }
    
    @Override
    public void start(Stage primaryStage) {
        ChangeHandler ch = new ChangeHandler();    
        txf1.addEventFilter(KeyEvent.KEY_RELEASED, ch);
        txf1.setMinWidth(100);
        txf1.setMaxWidth(100);
        txf2.addEventFilter(KeyEvent.KEY_RELEASED, ch);
        txf2.setMinWidth(90);
        txf2.setMaxWidth(90);
        txf3.addEventFilter(KeyEvent.KEY_RELEASED, ch);
        txf3.setMinWidth(90);
        txf3.setMaxWidth(90);
        
        GridPane root = new GridPane();
        VBox vbx = new VBox();
        vbx.getChildren().addAll(txf1, txf2, txf3);
        root.getChildren().add(vbx);
        Scene scene = new Scene(root, 300, 250);
        
        primaryStage.setTitle("Hello World!");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

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

Berhubungan dengan Schema : Menggunakan Connection untuk membaca Schema

Schema database tersimpan didalam DOKUMENTASI TERTULIS (kalau ada), atau didalam pikiran sang pembuat (kalau ingat), atau didalam DBMS secara terstruktur.

Kita akan menggunakan program untuk melakukan akses schema :

  1. Menampilkan judul tabel-tabel didalam database yang dicontohkan : sample. Bagaimanakah cara penulisan lengkapnya : jdbc:/derby:/127.0.0.1:1527 /sample
  2. Kita akan menampilkan tabel-tabel.
  3. Kita akan menampilkan kolom salah satu tabel. 
Cara yang harus dilakukan :
  1. Membuat koneksi
  2. Membuat object DatabaseMetaData
  3. Dari object diatas diambil object ResultSet yang mengandung nama tabel-tabel
  4. Mengambil kolom-kolom dan disimpan didalam ResultSet.
Contoh program singkatnya adalah :


package javadatabaseschema;

import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;

/**
 *
 * @author joko adianto
 * this sourcode is released under GPLv 3.
 */
public class JavaDatabaseSchema {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) throws 
            ClassNotFoundException, 
            InstantiationException, 
            IllegalAccessException, 
            SQLException {
        // TODO code application logic here
        Connection con;
        DatabaseMetaData dmd;
        ResultSet rst;
        Class.forName("org.apache.derby.jdbc.ClientDriver").newInstance();
        
        con = DriverManager.getConnection("jdbc:derby://localhost:1527/sample", 
                "app", "app");
        System.out.println("con.getCatalog() : " + con.getCatalog());
        System.out.println("con.getSchema() : " + con.getSchema());
        dmd = con.getMetaData();
        System.out.println("dmd.getCatalogTerm() : " + dmd.getCatalogTerm());
        rst = dmd.getSchemas();
        while(rst.next()){
            System.out.println(rst.getString(1) + " " 
                    +rst.getString(2));
        }
        rst = dmd.getCatalogs();
        while(rst.next()){
            System.out.println(rst.getString(1) + " " 
                    +rst.getString(2));
        }
        rst = dmd.getTables(null, null, null, 
        null);
        System.out.println("List of tables: "); 
        while (rst.next()) {
            System.out.println(
            rst.getString(1) 
            + ", "+rst.getString(2)
            + ", "+rst.getString(3)
            + ", "+rst.getString(4)
            + ", "+rst.getString(5)); 
        }
        
        System.out.println("List of Columns: "); 
        rst = dmd.getColumns(null, null,"CUSTOMER", "CUSTOMER_ID");
        while (rst.next()) {
            System.out.println(
            rst.getString(1) 
            + ", "+rst.getString(2)
            + ", "+rst.getString(3)
            + ", "+rst.getString(4)
            + ", "+rst.getString(5)); 
        }
        
        
        con.close();
        
        
    }
    
}