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();
        
        
    }
    
}