Saturday, December 17, 2016

Mencetak PDF dari database

Saya mencetak PDF dari contoh database yang disertakan oleh netbeans. Kode programnya adalah sebagai berikut :


import java.io.IOException;
import java.sql.Statement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.font.PDFont;
import org.apache.pdfbox.pdmodel.font.PDType1Font;

/**
 *
 * @author Joko Adianto
 */
public class MencetakPDF {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) throws
            ClassNotFoundException,
            InstantiationException,
            IllegalAccessException,
            SQLException,
            IOException {
        // TODO code application logic here
        int jumlahBaris = 4;
        int cacahBaris;
        int jarakBaris = 40;
        Class.forName("org.apache.derby.jdbc.ClientDriver").newInstance();
        Connection con =
                DriverManager.getConnection("jdbc:derby://localhost:1527/sample",
                        "app", "app");
        Statement stm = con.createStatement();
        ResultSet rst = stm.executeQuery("select * from customer");
        PDPageContentStream str;
        PDDocument document = new PDDocument();
        PDPage pge = new PDPage();
        document.addPage(pge);
        PDFont font = PDType1Font.COURIER;
        str = new PDPageContentStream(document,pge);
        cacahBaris = 0;
        while (rst.next()){
                str.beginText();
                    str.setFont(font, 18);
                    str.moveTextPositionByAmount(100, 400-jarakBaris*cacahBaris);
                    str.drawString(rst.getString(1));
                str.endText();
                str.beginText();
                    str.setFont(font, 18);
                    str.moveTextPositionByAmount(140, 400-jarakBaris*cacahBaris);
                    str.drawString(rst.getString(2));
                str.endText();
                str.beginText();
                    str.setFont(font, 18);
                    str.moveTextPositionByAmount(180, 400-jarakBaris*cacahBaris);
                    str.drawString(rst.getString(3));
                str.endText();
                cacahBaris++;
                if (cacahBaris==jumlahBaris){
                    str.close();
                    font = PDType1Font.COURIER;
                    pge = new PDPage();
                    document.addPage(pge);
                    str = new PDPageContentStream(document,pge);
                    cacahBaris = 0;          
                    }
        }
        str.close();
        document.save( "customer.pdf");
        document.close();
    }
 
}

Tuesday, December 13, 2016

Mencetak Dokumen PDF : Dengan Data yang Berasal dari Database

Untuk dapat mencetak dokumen dari database berbasis SQL, aktivitas yang dilakukan adalah sebagai berikut :

  1. Koneksi ke database yang sudah dibuat
  2. Menyiapkan statement
  3. membuat sebuah string berisi perintah SQL-Select
  4. menjalankan perintah tersebut pada statement, dan hasilnya disimpan didalam resultset
  5. buat dokumen
  6. buat halaman
  7. tentukan font
  8. masuk kedalam loop dari resultset :
    1. buat stream untuk halaman ke i
    2. tuliskan data kedalam teks
    3. jika i > jumlah maksimum baris maka 
      1. tutup stream
      2. buka stream bau
    4. Jika data sudah habis keluar dari loop
  9. tutup stream
  10. tentukan nama berkas
  11. tuliskan Dokumen kedalam berkas
Selanjutnya pada halaman berikut akan dibuat contoh implementasi dengan bahasa Java SE

Mencetak Dokumen PDF : 2 Halaman

Untuk dapat mencetak sebuah halaman yang diperlukan adalah :

  1. Font dan Dokumen Sudah dibuat
  2. Halaman Baru
  3. Stream Baru
  4. Tuliskan isi (dengan atau tanpa loop)
  5. Tutup Steram
Sebagai contoh potongan program berikut ini digunakan untuk membuat halaman pdf :


        // Membuat Stream
        contentStream = new PDPageContentStream(document, page);

        // Membuat Text
        contentStream.beginText();
        contentStream.setFont( font, 18 );
        contentStream.moveTextPositionByAmount( 100, 700 );
        contentStream.drawString( "Roti Vanilaku Enak Rasanya" );
        contentStream.endText();
        
        contentStream.beginText();        
        contentStream.moveTextPositionByAmount( 100, 680 );
        contentStream.drawString( "Roti Vanilaku Tidak Berwarna Coklat" );
        contentStream.endText();

        // Menutup Stream
         contentStream.close();

Adapun kode lengkap programnya adalah sebagai berikut :



package mencetak2halamanpdf;

import java.io.IOException;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.font.PDFont;
import org.apache.pdfbox.pdmodel.font.PDType1Font;

/**
 *
 * @author Joko Adianto
 * Kode program dibawah ini merupakan modfifikasi dari 
 * kode program pada 
 * https://pdfbox.apache.org/1.8/cookbook/documentcreation.html
 */
public class Mencetak2HalamanPDF {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) throws IOException {
        // Membuat Dokumen
        PDDocument document = new PDDocument();
        
        //Mebuat halaman baru
        PDPage page = new PDPage();
        
        //tambahkan halaman kedalam dokumen
        document.addPage( page );

        // Buat font
        PDFont font = PDType1Font.COURIER;

        // Buat stream
        PDPageContentStream contentStream = new PDPageContentStream(document, page);

        // Membuat Text
        contentStream.beginText();
        contentStream.setFont( font, 18 );
        contentStream.moveTextPositionByAmount( 100, 700 );
        contentStream.drawString( "Roti Coklatku Enak Rasanya" );
        contentStream.endText();

        // Menutup stream untuk sebuah halaman
        contentStream.close();
        
        //Membuat halaman ke dua
        page = new PDPage();
        document.addPage( page );
        // Menentukan font
        font = PDType1Font.TIMES_ITALIC;

        // Buat Stram
        contentStream = new PDPageContentStream(document, page);
        // Membuat Text
        contentStream.beginText();
        contentStream.setFont( font, 18 );
        contentStream.moveTextPositionByAmount( 100, 700 );
        contentStream.drawString( "Roti Vanilaku Enak Rasanya" );
        contentStream.endText();
        
        contentStream.beginText();        
        contentStream.moveTextPositionByAmount( 100, 680 );
        contentStream.drawString( "Roti Vanilaku Tidak Berwarna Coklat" );
        contentStream.endText();

        // Menutup Stream
        contentStream.close();

        // Menutup dokumen
        try{
        document.save( "rotikucoklatvanila.pdf");
        document.close();
        }
        catch (IOException ioe){
            System.out.println(ioe.getMessage());
            System.out.println("if it is being used by another process, CLOSE IT");
            
            
        }
    }
    
}



Mencetak dengan PdfBOX : Pendahuluan

Sebuah program lazimnya memiliki keluaran yang dapat dicetak. Belajar pemrograman secara wajar akan sampai kepada pertanyaan bagagaimanakah mencetak hasil pemrosesan data.
Untuk tahap awal kita akan mempelajari bagaimana mencetak sebuah berkas pdf. Untuk pertama kali kita akan mencetak : Roti Coklat.
Urut-urutan aktivitas yang kita lakukan adalah :

  1. Download library dari https://pdfbox.apache.org/download.cgi
  2. Kita akan memilih pdfbox-app-2.0.3.jar 7.9MB, pre-built PDFBox standalone binary
  3. Selanjutnya kita dowload
  4. Hasil download kita letakkan kedalam directory NetBeansProject
  5. Kita membuat project dalam bahasa java : Java Application
  6. Project tersebut bernama MencetakBerkasPDF
  7. KIta menambahkan jar/folder : RMB->Add JAR/Folder
  8. Kita pilih berkas pdfbox-app-2.0.3.jar
  9. Selanjutnya kita dapat menulis program
  10. Setelah menulis program kita jalankan
  11. Kemudian periksa directory MencetakBerkasPDF
  12. Didalamnya akan terdapat rotiku.pdf

Adapun kode program yang kita buat adalah sebagai berikut :

package mencetakberkaspdf;


import java.io.IOException;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.font.PDFont;
import org.apache.pdfbox.pdmodel.font.PDType1Font;

/**
 *
 * @author Joko Adianto
 * Kode program dibawah ini merupakan modfifikasi dari
 * kode program pada
 * https://pdfbox.apache.org/1.8/cookbook/documentcreation.html
 */
public class MencetakBerkasPDF {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) throws IOException {
        // Membuat dokumen
        PDDocument document = new PDDocument();

        //Membuat halaman
        PDPage page = new PDPage();
        document.addPage( page );

        // Untuk mencetak kita memerlukan jenis huruf(font)
        PDFont font = PDType1Font.COURIER;

        // Mebuat sebuah content stream yang mengandung isi yang akan dicetak
        PDPageContentStream contentStream = new PDPageContentStream(document, page);

        //Mulai mencetak    
        contentStream.beginText();
        contentStream.setFont( font, 18 );
        contentStream.moveTextPositionByAmount( 100, 700 );
        contentStream.drawString( "Roti Coklatku Enak Rasanya" );
        contentStream.endText();

        //Selesai mencetak stream ditutup
        contentStream.close();

        //Tuliskan kedalam berkas bernama rotiku.pdf
        try{
        document.save( "rotiku.pdf");
        document.close();
        }
        catch (IOException ioe){
            System.out.println(ioe.getMessage());
            System.out.println("Jika digunakan proses lain, TUTUP");
    }
 
}


Friday, December 2, 2016

Data Entry : membuat interface MemberEntriScreen

Untuk tampilan entri data kode program yang diperlukan adalah sebagai berikut :

package javafxtableview5;

import javafx.application.Application;
import javafx.beans.property.SimpleStringProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.TextField;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.layout.HBox;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

/**
 *
 * @author Joko Adianto
 * Released under GPLv3
 */
public class JavaFXTableView5 extends Application {

public static class Member{  
    private final SimpleStringProperty memberId;
    private final SimpleStringProperty memberName;
    private final SimpleStringProperty memberAddress;
 
 
    Member(String memberId, String memberName, String memberAddress) {
        this.memberId = new SimpleStringProperty(memberId);
        this.memberName = new SimpleStringProperty(memberName);
        this.memberAddress = new SimpleStringProperty(memberAddress);
    }
 
    public String getMemberId() {
        return memberId.get();
    }

    public void setMemberId(String memberId) {
        this.memberId.set(memberId);
    }
 
    public String getMemberName() {
        return memberName.get();
    }

    public void setMemberName(String memberName) {
        this.memberName.set(memberName);
    }
    public String getMemberAddress() {
        return memberAddress.get();
    }

    public void setMemberAddress(String memberAddress) {
        this.memberAddress.set(memberAddress);
    }
 
 
}

StackPane root;
Stage stage;
Scene scene;

//Id
HBox hbxId;
Label lblId;
TextField txfId;

//Name
HBox hbxName;
Label lblName;
TextField txfName;

//Name
HBox hbxAddress;
Label lblAddress;
TextField txfAddress;


//Button
HBox hbxButton;
Button btnSave;
Button btnCancel;

//Table
private final TableView<Member> tbvMember = new TableView<>();
private final ObservableList<Member> obsMember =
    FXCollections.observableArrayList();

VBox vbx;


{
    hbxId = new HBox();
    lblId = new Label("Id");
    lblId.setMinWidth(60);
    txfId = new TextField();
    hbxId.getChildren().addAll(lblId, txfId);

    hbxName = new HBox();
    lblName = new Label("Name");
    lblName.setMinWidth(60);
    txfName = new TextField();
    hbxName.getChildren().addAll(lblName, txfName);
 
    hbxAddress = new HBox();
    lblAddress = new Label("Address");
    lblAddress.setMinWidth(60);
    txfAddress = new TextField();
    hbxAddress.getChildren().addAll(lblAddress, txfAddress);

    //1st col
    TableColumn memberIdCol = new TableColumn("Id");
    memberIdCol.setMinWidth(50);
    memberIdCol.setCellValueFactory(
    new PropertyValueFactory<>("memberId"));
 
    //2st col
    TableColumn memberNameCol = new TableColumn("Member Name");
    memberNameCol.setMinWidth(200);
    memberNameCol.setCellValueFactory(
    new PropertyValueFactory<>("memberName"));
 
    //3rd col
    TableColumn memberAddressCol = new TableColumn("Member Address");
    memberAddressCol.setMinWidth(200);
    memberAddressCol.setCellValueFactory(
    new PropertyValueFactory<>("memberAddress"));
 
    //TableView's columns  
    tbvMember.getColumns().addAll(memberIdCol, memberNameCol, memberAddressCol);
 
    //TableViews and ObservableList wiring
    tbvMember.setItems(obsMember);
 
    btnSave = new Button();
    btnSave.setMinWidth(100);
    btnSave.setText("Save");
    btnSave.setOnAction(new EventHandler<ActionEvent>() {
         
            @Override
            public void handle(ActionEvent event) {
                String strId = txfId.getText();
                String strName = txfName.getText();
                String strAddress = txfAddress.getText();
                obsMember.add(new Member(strId, strName, strAddress));
                txfId.setText("");
                txfName.setText("");
             
            }
        });
 
    btnCancel = new Button();
    btnCancel.setText("Cancel");
    btnCancel.setMinWidth(100);
 
    btnCancel.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent event) {
                txfId.setText("");
                txfName.setText("");
            }
        });
 
    hbxButton = new HBox();
    hbxButton.setAlignment(Pos.CENTER);
    hbxButton.setSpacing(200);
    hbxButton.getChildren().addAll(btnSave, btnCancel);
    hbxButton.setSpacing(250);
    vbx = new VBox();
    vbx.getChildren().addAll(hbxId, hbxName, hbxAddress, hbxButton, tbvMember);
 
 
    root = new StackPane();
    root.getChildren().add(vbx);
    scene = new Scene(root, vbx.getMinWidth(), 300);
 
    }

@Override
public void start(Stage primaryStage)
    {
    stage = primaryStage;
    stage.setTitle("TableView ");
    stage.setScene(scene);
    stage.show();  
}

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

}

Wednesday, November 30, 2016

Membuat Aplikasi untuk Memasukkan Anggota Organization : Membuat Class MemberEntriScreen 2

Disini saya akan memodifikasi program Sebelumnya sehingga dapat memasukkan data kedalam database. Perubahan yang dilakukan adalah menambah class ButtonHandler yang nerupakan implementasi EventHandler :

/**
 *
 * @author Joko Adianto
 * Released under GPLv3
 */

package javafxorganization;

import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.stage.Stage;

public class MemberEntriScreen {
    String strSQL;
    Statement stmt;
    Group root;
    Stage stage;
    Scene scene;
    Connection conApp;
  
    Label lblId;
    TextField txfId;
    HBox hbxId;
  
    Label lblName;
    TextField txfName;
    HBox hbxName;
  
    Label lblAddress;
    TextField txfAddress;
    HBox hbxAddress;
    
    Button btnSave;
    Button btnCancel;
    HBox hbxButton;
  
    VBox vbxMember;
    
    ButtonHandler bh;
    
    class ButtonHandler implements EventHandler<ActionEvent>{
        
        @Override
        public void handle(ActionEvent t) {
            //BUTTON SAVE
            if (t.getSource().equals(btnSave)){
                strSQL = "insert into member values("+
                        "'"+txfId.getText()+
                        "', '" +txfName.getText()+
                        "', '" +txfAddress.getText()+
                        "')";
                txfAddress.setText(strSQL);
                try {
                    stmt.execute(strSQL);
                }
                catch (SQLException ex){
                }
            }
            //BUTTON CANCEL
            else if(t.getSource().equals(btnCancel)){
              txfId.setText("");
              txfName.setText("");
              txfAddress.setText("");
            }
        }
      
    }
  
    {
        lblId = new Label("Member Id");
        lblId.setMinWidth(80);
        txfId = new TextField();
        txfId.setMinWidth(120);
        hbxId = new HBox();
        hbxId.getChildren().addAll(lblId, txfId);
      
  
        lblName = new Label("Name");
        lblName.setMinWidth(80);
        txfName = new TextField();
        txfName.setMinWidth(120);
        hbxName = new HBox();
        hbxName.getChildren().addAll(lblName, txfName);
  
        lblAddress = new Label("Address");
        lblAddress.setMinWidth(80);
        txfAddress = new TextField();
        txfAddress.setMinWidth(120);
        hbxAddress = new HBox();
        hbxAddress.getChildren().addAll(lblAddress, txfAddress);
        
        bh = new ButtonHandler();
        btnSave = new Button("Save");
        btnSave.setMinWidth(200);
        btnSave.setOnAction(bh);
        
        btnCancel = new Button("Cancel");
        btnCancel.setMinWidth(200);
        btnCancel.setOnAction(bh);
        hbxButton = new HBox();
        hbxButton.getChildren().addAll(btnSave, btnCancel);
        
        vbxMember = new VBox();
        vbxMember.getChildren().addAll(hbxId, 
                hbxName, 
                hbxAddress,
                hbxButton);
    }
  
    MemberEntriScreen(Stage stage, Connection conApp) throws SQLException{
        this.stage = stage;       
        this.conApp = conApp;
        stmt = this.conApp.createStatement();        
        root = new Group();
        root.getChildren().addAll(vbxMember);
        scene = new Scene(root, 800, 600, Color.BEIGE);
        this.stage.setScene(scene);
        this.stage.setTitle("Entri Data Member");
        this.stage.show();
    }
  
}

Tuesday, November 29, 2016

Membuat Aplikasi untuk Memasukkan Anggota Organization : Membuat Class MemberEntriScreen 1

Disini kita akan membuat halaman untuk memasukkan data. Saya akan membuat class MemberEntriScreen. Class ini ditujukan untuk memasukkan data. Data yang dimasukkan disimpan didalam database. Program ini akan menampilkan Text Field untuk menerima Member Id, Member Name, Member Address.

Program ini menggunakan 3 buah label dan 3 buah field. Tetapi tanpa button, yang akan diimplementasi oleh ANDA : BE A HERO.  Program ini hanya bisa dan pasti hanya bisa MEMASUKKAN SATU BARIS DATA SAJA : KARENA SETIAP KALI BERJALAN PERNYATAAN BERIKUT INI DIEKSEKUSI DAN PRIMARY KEY MENUNJUK NILAI YANG UNIK DIDALAM TABEL TERSEBUT.

.....
memasukkan 1 (satu) member SAJA : Karena pernyataan berikut :
this.stage.setTitle("Login To Application");
Statement stmt = conApp.createStatement();
stmt.execute("insert into member values('12345678', 'Budi Subudi',"
                + "'Jl. ABCDEFG NO 12345678')");
this.stage.show();
.....

Adapun kode program lengkapnya adalah sebagai berikut :
/**
 *
 * @author Joko Adianto
 * Released under GPLv3
 */

package javafxorganization;

import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.stage.Stage;

public class MemberEntriScreen {
    Group root;
    Stage stage;
    Scene scene;
    Connection conApp;
 
    Label lblId;
    TextField txfId;
    HBox hbxId;
 
    Label lblName;
    TextField txfName;
    HBox hbxName;
 
    Label lblAddress;
    TextField txfAddress;
    HBox hbxAddress;
 
    VBox vbxMember;
 
    {
        lblId = new Label("Member Id");
        lblId.setMinWidth(80);
        txfId = new TextField();
        txfId.setMinWidth(120);
        hbxId = new HBox();
        hbxId.getChildren().addAll(lblId, txfId);
     
 
        lblName = new Label("Name");
        lblName.setMinWidth(80);
        txfName = new TextField();
        txfName.setMinWidth(120);
        hbxName = new HBox();
        hbxName.getChildren().addAll(lblName, txfName);
 
        lblAddress = new Label("Address");
        lblAddress.setMinWidth(80);
        txfAddress = new TextField();
        txfAddress.setMinWidth(120);
        hbxAddress = new HBox();
        hbxAddress.getChildren().addAll(lblAddress, txfAddress);
     
        vbxMember = new VBox();
        vbxMember.getChildren().addAll(hbxId, hbxName, hbxAddress);
    }
 
    MemberEntriScreen(Stage stage, Connection conApp) throws SQLException{
        this.stage = stage;      
        this.conApp = conApp;
        root = new Group();
        root.getChildren().addAll(vbxMember);
        scene = new Scene(root, 800, 600, Color.BEIGE);
        this.stage.setScene(scene);
        this.stage.setTitle("Login To Application");

//YOU WILL IMPLEMENT THIS IN A BUTTON DEFINITION
        Statement stmt = conApp.createStatement();
        stmt.execute("insert into member values('12345678', 'Budi Subudi',"
                + "'Jl. ABCDEFG NO 12345678')");
//THIS STATEMENT USES conApp passed by previous Class

        this.stage.show();
    }
 
}

Membuat Aplikasi untuk Memasukkan Anggota Organization : Membuat Class LoginScreen

Class LoginScreen memiliki constructor yang menerima referensi Primary Stage dan Connection. PrimaryStage dan Connection tersebut akan digunakan oleh semua screen dari aplikasi-aplikasi. Constructor yang kita gunakan adalah :
LoginScreen(Stage stage, Connection conApp)

Perhatikanlah bahwa login screen ini hanya melakukan koneksi ke database. BeLuM menampilkan layar untuk memasukkan data-data Member. Hal ini terlihat dari inner ButtonHandler yang merupakan penerapan dari  EventHandler. Disebut penerapan karena EventHandler adalah interface.

Untuk melakukan menampilkan Layar MemberEntriScreen, kita akan mebuat program yang ditampilkan pada layar berikutnya.


class ButtonHandler implements EventHandler<ActionEvent>{

        @Override
        public void handle(ActionEvent t) {
            if (t.getSource().equals(btnLogin)){
                try {
                    conApp = DriverManager.getConnection(
                            "jdbc:derby://localhost:1527/Organization",
                            txfUser.getText(),
                            psfPassword.getText());
                    btnLogin.setText("Success");
                } catch (SQLException ex) {
                    txfUser.setText("failed login");
                }
             
            }
            else if(t.getSource().equals(btnCancel)){
             
            }
        }
     
    }

Adapun kode program lengkapnya adalah sebagai berikut :


/**
 *
 * @author Joko Adianto
 * Released under GPLv3;
 */

package javafxorganization;

import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.PasswordField;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.stage.Stage;

public class LoginScreen {
    Group root;
    Stage stage;
    Scene scene;
    Connection conApp;
 
    Label lblUser;
    TextField txfUser;
    HBox hbxUser;
 
    Label lblPassword;
    PasswordField psfPassword;
    HBox hbxPassword;
 
    Button btnLogin;
    Button btnCancel;
    HBox hbxButton;
    VBox vbxLogin;
 
    ButtonHandler bh;
 
    class ButtonHandler implements EventHandler<ActionEvent>{

        @Override
        public void handle(ActionEvent t) {
            if (t.getSource().equals(btnLogin)){
                try {
                    conApp = DriverManager.getConnection(
                            "jdbc:derby://localhost:1527/Organization",
                            txfUser.getText(),
                            psfPassword.getText());
                    btnLogin.setText("Success");
                } catch (SQLException ex) {
                    txfUser.setText("failed login");
                }
             
            }
            else if(t.getSource().equals(btnCancel)){
             
            }
        }
     
    }
 
    {
        lblUser = new Label("User");
        lblUser.setMinWidth(80);
        txfUser = new TextField();
        txfUser.setMinWidth(120);
        hbxUser = new HBox();
        hbxUser.getChildren().addAll(lblUser, txfUser);
     
 
        lblPassword = new Label("Password");
        lblPassword.setMinWidth(80);
        psfPassword = new PasswordField();
        psfPassword.setMinWidth(120);
        hbxPassword = new HBox();
        hbxPassword.getChildren().addAll(lblPassword, psfPassword);
 
        btnLogin = new Button("Login");
        btnLogin.setMinWidth(lblPassword.getMinWidth());
        btnCancel = new Button("Cancel");      
        btnCancel.setMinWidth(lblPassword.getMinWidth());
     
        hbxButton = new HBox(65);
     
     
        hbxButton.getChildren().addAll(btnLogin, btnCancel);
     
        vbxLogin = new VBox();
        vbxLogin.getChildren().addAll(hbxUser, hbxPassword, hbxButton);
 
        bh = new ButtonHandler();
        btnLogin.setOnAction(bh);
        btnCancel.setOnAction(bh);
    }
 
    LoginScreen(Stage stage, Connection conApp){
        this.stage = stage;      
        this.conApp = conApp;
        root = new Group();
        root.getChildren().addAll(vbxLogin);
        scene = new Scene(root, vbxLogin.getMinWidth(),
                vbxLogin.getMinHeight(),
                Color.AQUAMARINE);
        this.stage.setScene(scene);
        this.stage.setTitle("Login To Application");
        this.stage.show();
    }
 
}

Membuat Aplikasi untuk Memasukkan Anggota Organization : Membuat Titik masuk Aplikasi

Selanjutnya saya akan membuat aplikasi untuk memasukkan para anggota Organization kedalam Member. Titik masuk aplikasi ini adalah Stage dalam hal ini primary Stage. Cara yang dilakukan adalah :
  • Meneruskan primaryStage tersebut ke setiap class-class yang lain yang akan berisi scene.
  • Class-class yang lain tersebut juga akan berisi reference variable terhadap connection.
  • Jangan Lupa memasukkan JavaDB Driver library agar dapat melakukan eksekusi Class.forName("org.apache.derby.jdbc.ClientDriver").newInstance();
Source kode yang dibuat adalah :
/**
 *
 * @author Joko Adianto
 * Released under GPLv3
 */
package javafxorganization;

import java.sql.Connection;
import javafx.application.Application;
import javafx.stage.Stage;


public class JavaFXOrganization extends Application {
    LoginScreen loginScreen;
        Connection conApp;
    @Override
    public void start(Stage primaryStage) throws ClassNotFoundException, InstantiationException {
        Class.forName("org.apache.derby.jdbc.ClientDriver").newInstance();
        
        loginScreen = new LoginScreen(primaryStage, conApp);
        
        }

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

Jika kita belum membuat class LoginScreen maka aplikasi kita tidak dapat dieksekusi. Hal tersebut dikarenakan kita mencoba membuat reference variable yang jenisnya belum ada. Program ini baru dapat dieksekusi setelah membuat class LoginScreen.

LoginScreen akan dijelaskan pada halaman berikutnya

Membuat Database : Organization dan Table : Member

Saya membuat Database bernama Organization. Nama User adalah : app dan Password User adalah : app. Penamaan dan penentuan password dilakukan secara sederhana agar tidak lupa. Selanjutnya saya akan membuat table Member :

  • Koneksi ke database organisasi dengan muliskan nama user dan password yang sudah ditentukan sebelumnya
  • Melakukan penulisan perintah SQL dan dieksekusi :

create table Member (
    MemberId varchar(8),
    MemberName varchar(30),
    MemberAddress varchar(30),
    primary key(MemberId)
)

Tuesday, November 15, 2016

Contoh Combo Box dan ListView pada sebuah aplikasi

Saya membuat contoh aplikasi :

  • ObservableList diisi data dari TextField
  • ObservableList digunakan oleh ComboBox dan ListView Sekaligus
Berikut ini adalah potongan programnya :

/**
 *
 * @author Joko Adianto
 */
public class JavaFXComboBoxListView extends Application {
    final ObservableList<String> data = FXCollections.observableArrayList();
    final TextField inputField = new TextField();
    @Override
    public void start(Stage primaryStage) {
        ComboBox<String> comboBox = new ComboBox<>();
        comboBox.itemsProperty().setValue(data);
        ListView<String> listView = new ListView<>();
        listView.itemsProperty().setValue(data);
        
        inputField.setPromptText("insert new data type");
        //inputField.setOnAction(e -> data.add(inputField.getText()));
        inputField.setOnAction(new EventHandler<ActionEvent>() {
          
            @Override
            public void handle(ActionEvent event) {
                data.add(inputField.getText());
            }
        });
        
        
        VBox box = new VBox();
        box.getChildren().addAll(inputField, comboBox, listView);
        box.setAlignment(Pos.CENTER);
        Scene myScene = new Scene(box);
        primaryStage.setScene(myScene);
        primaryStage.show();
    }

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

Contoh Combo Box Sederhana

Berikut ini saya membuat contoh combo box yang berisi data teman-teman :

/**
 *
 * @author Joko Adianto
 */
public class JavaFXComboBox extends Application {
 
    @Override
    public void start(Stage primaryStage) {
        ComboBox<String> comboBox = new ComboBox<>();
        ObservableList<String> oblTeman = FXCollections.observableArrayList();
        comboBox.itemsProperty().setValue(oblTeman);
        oblTeman.addAll("Hannibal Lecter", "Three Fingers",
                "Saw Thooth", "Chucky", "Tiffany", "Anabelle");      
             
        StackPane root = new StackPane();
        root.getChildren().add(comboBox);
     
        Scene scene = new Scene(root, 300, 250);
     
        primaryStage.setTitle("Daftar Teman Masa Kecil");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

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

Contoh Membuat Combo Box

Berikut ini adalah potongan program untuk menghadirkan sebuah Combo Box :

/**
 *
 * @author Joko Adianto
 */
public class JavaFXComboBox extends Application {
   
    @Override
    public void start(Stage primaryStage) {
        ComboBox<String> comboBox = new ComboBox<>();
        ObservableList<String> oblTeman = FXCollections.observableArrayList();
        comboBox.itemsProperty().setValue(oblTeman);
        oblTeman.addAll("Hannibal Lecter", "Three Fingers", "Saw Thooth");      
               
        StackPane root = new StackPane();
        root.getChildren().add(comboBox);
       
        Scene scene = new Scene(root, 300, 250);
       
        primaryStage.setTitle("Daftar Teman Masa Kecil");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

Contoh Membuat Slider dengan Loop

Berikut ini ini adalah contoh membuat banyak slider dengan loop. Dimana inisiasi dilakukan pada initializer block :

/**
 *
 * @author Joko Adianto
 */
public class JavaFXSlider2 extends Application {
    Slider slider[] = new Slider[5];
    HBox box;

{
    box = new HBox();
    int j = 0;
    while(j<slider.length){
        slider[j] = new Slider(-12,12,1);
        box.getChildren().add(slider[j]);
        slider[j++].setOrientation(Orientation.VERTICAL);
    }
}

@Override
public void start(Stage primaryStage) throws Exception {
    box.setAlignment(Pos.CENTER);
    HBox.setHgrow(slider[4], Priority.ALWAYS);  
    Scene myScene = new Scene(box);
    primaryStage.setScene(myScene);
    primaryStage.setTitle("Contoh Membuat Banyak Slider dengan loop");
    primaryStage.setWidth(600);
    primaryStage.setHeight(600);
    primaryStage.show();
    }

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

Friday, November 11, 2016

Control Lanjutan : Membuat Slider

Berikut ini adalah kode program untuk membuat slider vertikal dan slider horizontal :

/*
 * 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 javafxslider;

import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.geometry.Orientation;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Slider;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Priority;
import javafx.stage.Stage;
import javafx.util.StringConverter;
public class JavaFXSlider extends Application {
@Override
public void start(Stage primaryStage) throws Exception {
    Slider slider1 = new Slider(-10, 70, 20);
    slider1.setMajorTickUnit(25);
    slider1.setShowTickLabels(true);
    slider1.setShowTickMarks(true);
    slider1.setBlockIncrement(25);
    slider1.setSnapToTicks(true);
    slider1.setMinorTickCount(25);
    slider1.setOrientation(Orientation.VERTICAL);
    slider1.setLabelFormatter(new StringConverter<Double>(){
   
    @Override
    public String toString(Double object) {
        return object + " °C";
    }

    @Override
    public Double fromString(String string) {
        return new Double(string.substring(0, string.length() - 3));
        }
    });
   
    slider1.valueProperty().addListener((e) -> System.out.println(slider1.
    getValue() + " °Celsius "));
    Slider slider2 = new Slider(-5.0, 5.0, 0.5);
    slider2.setMajorTickUnit(1);
    slider2.setShowTickLabels(true);
    slider2.setShowTickMarks(true);
    HBox box = new HBox(slider1, slider2);
    box.setAlignment(Pos.CENTER);
    box.setPadding(new Insets(12));
    HBox.setHgrow(slider2, Priority.ALWAYS);
    Scene myScene = new Scene(box);
    primaryStage.setScene(myScene);
    primaryStage.setTitle("Pengatur Suhu");
    primaryStage.setWidth(300);
    primaryStage.setHeight(200);
    primaryStage.show();
    }


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

Tuesday, November 8, 2016

Contoh Menu :Lanjutan

Berikut ini adalah contoh menu dengan separator dan sub menu


package javafxmenu1;

import javafx.application.Application;
import javafx.scene.Scene;

import javafx.scene.control.Menu;
import javafx.scene.control.MenuBar;
import javafx.scene.control.MenuItem;
import javafx.scene.control.SeparatorMenuItem;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;


/**
 *
 * @author Joko Adianto
 */
public class JavaFXMenu1 extends Application {
    /*
    Urut-urutan eksekusi berkenaan dengan eksekusi deklarasi, static var/refvar,
    static initizialization block, var/refvar, initialization block, constructor
    1. Inisialisasi Super class
    2. Inisialisasi Static Var/RefVar dan Static Initialization Block
        sesuai dengan urut-urutan Penulisan
    3. Inisialisasi Non-Static Var/RefVar dan Non-Static Initialization Block
        sesuai dengan urut-urutan Penulisan
    4. Constructor
    */
   
    /*
    Deklarasi bermacam-macam reference variable yang menunjuk object :
    1. MenuBar
    2. MenuItem
    3. Separator
    */
    MenuBar menuBar1;
    Menu mnuFile;
    MenuItem mniNewProject;
    MenuItem mniNewFile;
    SeparatorMenuItem smiSeparator1;
    MenuItem mniOpenProject;
    Menu mnuOpenRecentProject;
    SeparatorMenuItem smiSeparator2;
    Menu mnuImportProject;
    MenuItem mniEclipseProject;
    MenuItem mniResychronizeEclipseProject;  
    MenuItem mniImportProjectFromZIP;  
    Menu mnuExportProject;  
    MenuItem mniToZIP;
    {
        menuBar1 = new MenuBar();
        mnuFile = new Menu("File");
        mniNewProject = new MenuItem("New Project");      
        mniNewFile = new MenuItem("New File");
        smiSeparator1 = new SeparatorMenuItem();
        smiSeparator2 = new SeparatorMenuItem();
        mniOpenProject = new MenuItem("Open Project");
        mnuOpenRecentProject = new Menu("Open Recent Project");
        mnuOpenRecentProject.setDisable(true);
       
        mnuImportProject = new Menu("Import Project");
        mniEclipseProject = new MenuItem("Import Eclipse Project");
        mniResychronizeEclipseProject = new
            MenuItem("Resynchronize Import Eclipse Project");
        mniImportProjectFromZIP = new MenuItem("Import from ZIP");
        mnuImportProject.getItems().addAll(
            mniEclipseProject,
            mniResychronizeEclipseProject,
            mniImportProjectFromZIP
            );
        mnuExportProject = new Menu("Export Project");
        mniToZIP = new MenuItem("Export Project To ZIP");
        mnuExportProject.getItems().add(mniToZIP);
        /*
        Letakkan menu item dan separator menu item kedalam container yang
        cocok :
        SeparatorMenuItem, Menu dan MenuItem diletakkan kedalam Menu
        Menu diletakkan kedalam menuBar
        */
        mnuFile.getItems().addAll(
            mniNewProject,
            mniNewFile,
            smiSeparator1,
            mniOpenProject,
            mnuOpenRecentProject,
            //Letakkan Menu yang memiliki Sub menu          
            smiSeparator2,
            mnuImportProject,
            mnuExportProject
            );
        menuBar1.getMenus().add(mnuFile);
    }
   
    @Override
    public void start(Stage primaryStage) {      
        BorderPane root = new BorderPane();
        root.setTop(menuBar1);      
        Scene scene = new Scene(root, 300, 250);      
        primaryStage.setTitle("Contoh Menu");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

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

   
   
}

Tuesday, October 11, 2016

Menu dengan Border Pane : Mengisi, Top, Left, Right, Bottom

Saya mengisi BorderPane dengan :

  • Top berisi Menu
  • Left berisi tiga buah tombol
  • Right berisi tiga buah tombol
  • Bottom berisi tiga buah tombol
Program yang saya buat adalah sebagai berikut :


/*
 * 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 menu3;

import javafx.application.Application;
import javafx.geometry.Pos;

import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Menu;
import javafx.scene.control.MenuBar;
import javafx.scene.control.MenuItem;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

/**
 *
 * @author Joko Adianto
 */
public class MenuWithBorderPane2 extends Application {
    
    @Override
    public void start(Stage primaryStage) {
        MenuBar menuBarLogin = new MenuBar();
        Menu menuFile = new Menu("File");
        menuBarLogin.getMenus().add(menuFile);
        MenuItem menuItemLogin = new MenuItem("Login");
        MenuItem menuItemLogout = new MenuItem("Logout");
        menuFile.getItems().addAll(menuItemLogin, menuItemLogout);
        Menu menuPreferences = new Menu("Preferences");
        menuBarLogin.getMenus().add(menuPreferences);
        MenuItem menuItemZoom = new MenuItem("Zoom");
        MenuItem menuItemFont = new MenuItem("Font");
        menuPreferences.getItems().addAll(menuItemZoom, menuItemFont);
        
        Button btnOne = new Button("Button 1");
        Button btnTwo = new Button("Button 2");
        Button btnThree = new Button("Button 3");
        VBox vBoxButtonL = new VBox();
        vBoxButtonL.getChildren().addAll(btnOne, btnTwo, btnThree);
        
        Button btnFour = new Button("Button 4");
        Button btnFive = new Button("Button 5");
        Button btnSix = new Button("Button 6");
        VBox vBoxButtonR = new VBox();
        vBoxButtonR.getChildren().addAll(btnFour, btnFive, btnSix);
        
        Button btnSeven = new Button("Button 7");
        Button btnEight = new Button("Button 8");
        Button btnNine = new Button("Button 9");
        HBox hBoxButtonB = new HBox();
        hBoxButtonB.setAlignment(Pos.CENTER);
        hBoxButtonB.getChildren().addAll(btnSeven, btnEight, btnNine);
        
        
        BorderPane root = new BorderPane();
        root.setTop(menuBarLogin);
        root.setLeft(vBoxButtonL);
        root.setRight(vBoxButtonR);
        root.setBottom(hBoxButtonB);
        Scene scene = new Scene(root, 300, 250);
                
        primaryStage.setTitle("Menu Example with Border Pane ...!");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

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

Membuat Menu : dengan BorderPane

Alternative kedua adalah menggunakan border pane untuk membuat menu. Contoh kode program yang saya buat adalah :

/*
 * 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 menu2;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Menu;
import javafx.scene.control.MenuBar;
import javafx.scene.control.MenuItem;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;

/**
 *
 * @author Joko Adianto
 */
public class MenuWithBorderPane extends Application {
 
    @Override
    public void start(Stage primaryStage) {
        MenuBar menuBarLogin = new MenuBar();
        Menu menuFile = new Menu("File");
        menuBarLogin.getMenus().add(menuFile);
        MenuItem menuItemLogin = new MenuItem("Login");
        MenuItem menuItemLogout = new MenuItem("Logout");
        menuFile.getItems().addAll(menuItemLogin, menuItemLogout);
        Menu menuPreferences = new Menu("Preferences");
        menuBarLogin.getMenus().add(menuPreferences);
        MenuItem menuItemZoom = new MenuItem("Zoom");
        MenuItem menuItemFont = new MenuItem("Font");
        menuPreferences.getItems().addAll(menuItemZoom, menuItemFont);
     
        BorderPane root = new BorderPane();
        root.setTop(menuBarLogin);
     
        Scene scene = new Scene(root, 300, 250);
     
        primaryStage.setTitle("Menu Example ...!");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

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

Membuat Menu

Saya membuat sebuah layar yang terdiri dari dua buah menu :

  • Menu File dengan anak menu : Login dan Logout
  • Menu Preferences dengan anak menu : Zoom dan Font
Program ini merupakan dasar berpikir tentang menu. Kode programnya adalah sebagai berikut :


import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Menu;
import javafx.scene.control.MenuBar;
import javafx.scene.control.MenuItem;

import javafx.stage.Stage;

/**
 *
 * @author Joko Adianto
 */
public class JavaFXMenu extends Application {
    
    @Override
    public void start(Stage primaryStage) {
        Button btn = new Button();
        MenuBar menuBarLogin = new MenuBar();
        Menu menuFile = new Menu("File");
        menuBarLogin.getMenus().add(menuFile);
        MenuItem menuItemLogin = new MenuItem("Login");
        MenuItem menuItemLogout = new MenuItem("Logout");
        menuFile.getItems().addAll(menuItemLogin, menuItemLogout);
        Menu menuPreferences = new Menu("Preferences");
        menuBarLogin.getMenus().add(menuPreferences);
        MenuItem menuItemZoom = new MenuItem("Zoom");
        MenuItem menuItemFont = new MenuItem("Font");
        menuPreferences.getItems().addAll(menuItemZoom, menuItemFont);
        
        Group root = new Group();
        root.getChildren().addAll(menuBarLogin);
        
        Scene scene = new Scene(root, 300, 250);
        
        primaryStage.setTitle("Menu Example ...!");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

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

Layar Masukan Data Teman

Untuk memasukkan data teman digunakan  class berikut ini :

/*
 * 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 javafxlogin;

import javafx.event.Event;
import javafx.event.EventHandler;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.stage.Stage;

/**
 *
 * @author Joko Adianto
 */
public class FriendsEntri {
    Stage stage;
    Label lblName;
    TextField txfName;
    Label lblAddress;
    TextField txfAddress;
    Button btnSave;
    Button btnExit;
    HBox hBoxName;
    HBox hBoxAddress;
    HBox hBoxButton;
    VBox vBoxFriendsEntri;
    Group root1;  
    Scene scene1;
    Scene scene2;
    ButtonHandler bh;
   
    class ButtonHandler implements EventHandler{

        @Override
        public void handle(Event event) {
            if (event.getSource().equals(btnSave)){
               
            }
            if (event.getSource().equals(btnExit)){              
                stage.setScene(scene2);
                stage.show();
            }
        }
       
    }
   
   
    FriendsEntri(Stage pStage){
        stage = pStage;      
        scene2 = stage.getScene();
        ButtonHandler bh = new ButtonHandler();
       
        hBoxName = new HBox();
        lblName = new Label("Name");
        txfName = new TextField();
        hBoxName.getChildren().addAll(lblName, txfName);
       
        hBoxAddress = new HBox();
        lblAddress = new Label("Address");
        txfAddress = new TextField();
        hBoxAddress.getChildren().addAll(lblAddress, txfAddress);
       
        hBoxButton = new HBox();
        btnSave = new Button("Save");
        btnSave.setOnAction(bh);
        btnExit = new Button("Exit");
        btnExit.setOnAction(bh);
        hBoxButton.getChildren().addAll(btnSave, btnExit);
       
        vBoxFriendsEntri = new VBox();
       
        vBoxFriendsEntri.getChildren().addAll(hBoxName,
                hBoxAddress, hBoxButton);
       
        root1 = new Group();
        root1.getChildren().addAll(vBoxFriendsEntri);
        scene1 = new Scene(root1, vBoxFriendsEntri.getMaxWidth(),
                vBoxFriendsEntri.getMaxHeight(), Color.ALICEBLUE);
        stage.setScene(scene1);
        stage.setTitle("Friends' Data");
        stage.show();
       
       
       
    }
   
}

Membuat Screem Login

Saya akan memanggil sebuah screen. Screen tersebut adalah untuk login. Adapun program pertama adalah :

/*
 * 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 javafxlogin;

import javafx.application.Application;
import javafx.stage.Stage;

/**
 *
 * @author Joko Adianto
 */
public class JavaFXFriends extends Application {
    LoginScreen loginScreen;
 
    @Override
    public void start(Stage primaryStage) {
        loginScreen = new LoginScreen(primaryStage);
    }

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

Program ini akan membuat sebuah login screen :
  1. Class ini dipanggil oleh JavaFXFriends
  2. Jika button Login DIpencet akan menampilkan object FriendsEntri.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 javafxlogin;

import javafx.event.ActionEvent;
import javafx.event.Event;
import javafx.event.EventHandler;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.PasswordField;
import javafx.scene.control.TextField;
import javafx.scene.control.Button;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;

import javafx.stage.Stage;



/**
 *
 * @author Joko Adianto
 */
public class LoginScreen {
    Stage stage;
    Label lblUser;
    TextField txfUser;
    Label lblPassword;
    PasswordField pswPassword;
    Button btnLogin;
    Button btnExit;
    HBox hBoxUser;
    HBox hBoxPassword;
    HBox hBoxButton;
    VBox vBoxLogin;
    Group root;
    Scene scene;
    ButtonHandler bh;
    
    private void displayFriendsEntri(Stage stage){
        FriendsEntri friendsEntri = new FriendsEntri(stage);
        
    }
    
    class ButtonHandler implements EventHandler{

        @Override
        public void handle(Event event) {
            if (event.getSource().equals(btnLogin)){
                displayFriendsEntri(stage);
            }
            if (event.getSource().equals(btnExit)){
                stage.close();
                
            }
        }
        
    }
    
    LoginScreen(Stage pStage){
        bh = new ButtonHandler();
        //User        
        hBoxUser = new HBox();
        
        lblUser = new Label("User");
        lblUser.setMinWidth(80);
        txfUser = new TextField();
        hBoxUser.getChildren().addAll(lblUser, txfUser);
        
        //Password
        hBoxPassword = new HBox();
        lblPassword = new Label("Password");
        lblPassword.setMinWidth(80);
        pswPassword = new PasswordField();
        hBoxPassword.getChildren().addAll(lblPassword, pswPassword);
        
        //Button
        hBoxButton = new HBox(); 
        btnLogin = new Button("Login");        
        btnLogin.setMinWidth(80);        
        btnExit = new Button("Exit");        
        btnExit.setMinWidth(80);        
        hBoxButton.setSpacing(65);
        btnLogin.setOnAction(bh);
        btnExit.setOnAction(bh);
        hBoxButton.getChildren().addAll(btnLogin, btnExit);
        
        vBoxLogin = new VBox();
        vBoxLogin.getChildren().addAll(hBoxUser, hBoxPassword, hBoxButton);
        
        root = new Group();
        root.getChildren().addAll(vBoxLogin);
        scene = new Scene(root, vBoxLogin.getMinWidth(), 
                vBoxLogin.getMinHeight(), Color.BEIGE);
        stage = pStage;
        stage.setScene(scene);
        stage.setTitle("Login");
        stage.show();
    }
}

&& && &&

Tuesday, October 4, 2016

Program Bertukar Scene : Untuk login dan entri data

Saya akan membuat program yang bertukar scene :

  1. Layar pertama digunakan untuk login : Nama Pengguna, Password. Jika tombol login dipencet masuk ke layar berikutnya : Entri data teman. Jika tombol keluar dipencet maka akan keluar dari Aplikasi
  2. Layar entri data teman terdiri dari : isian Nomor, Nama, Alamat.Jika tombol keluar dipencet maka akan keluar dari layar ini, dan berpindah ke layar login.

Saturday, September 24, 2016

Scene : Contoh Kedua dengan Merubah Title

Contoh Program Kedua

package javafxsceneswitch1;

import javafx.application.Application;

import javafx.event.Event;
import javafx.event.EventHandler;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.paint.Color;
import javafx.stage.Stage;

/**
 *
 * @author Joko
 */
public class JavaFXSceneSwitch1 extends Application {
    ButtonHandler bh;
    Stage stage;
   
    Group group1;
    Scene scene1;
    Button btnToScene2;
   
    Group group2;
    Scene scene2;
    Button btnToScene1;
   
    class ButtonHandler implements EventHandler{

        @Override
        public void handle(Event event) {
            if(event.getSource().equals(btnToScene2)){
                stage.setTitle("I am in scene2");
                stage.setScene(scene2);
            }
            if(event.getSource().equals(btnToScene1)){
                stage.setTitle("I am in scene1");
                stage.setScene(scene1);
            }
        }
       
    }
   
    @Override
    public void start(Stage primaryStage) {
        bh = new ButtonHandler();
        //primaryStage akan disalin rujukannya ke
        //stage
        stage=primaryStage;
       
        //Yang akan ditampilkan pada mulanya adalah
        //scene1
        group1 = new Group();
        btnToScene2 = new Button("Switch to Scene 2");
        btnToScene2.setOnAction(bh);
        group1.getChildren().add(btnToScene2);
        scene1 = new Scene(group1, 300, 250, Color.CADETBLUE);
       
        //Kita juga akan membuat scene2
        group2 = new Group();
        btnToScene1 = new Button("Switch to Scene 1");
        btnToScene1.setOnAction(bh);
        group2.getChildren().add(btnToScene1);
        scene2 = new Scene(group2, 300, 250, Color.MAROON);
       
        primaryStage.setTitle("Scene Switcher");
        primaryStage.setScene(scene1);
        primaryStage.show();
    }

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

Friday, September 23, 2016

Scene : Program Bertukar Scene

Program bertukar Scene

package javafxswitchscene;

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.paint.Color;
import javafx.stage.Stage;

/**
 *
 * @author Joko Adianto
 */
public class JavaFXSwitchScene extends Application {

    ButtonHandler bh;
    Group root1;
    Group root2;
    //Untuk scene1
    Scene scene1;  
    Button btnToScene2;
 
    //Untuk scene2
    Scene scene2;
    Button btnToScene1;
 
    //Untuk Stage
    Stage stage;
 
    //Inner class untuk handler
    class ButtonHandler
    implements EventHandler <ActionEvent>
    {
        @Override public void handle(ActionEvent e)
        {
            System.out.println("ASDF");
            if(e.getSource().equals(btnToScene2)){
                stage.setScene(scene2);
             
            }
            if(e.getSource().equals(btnToScene1)){
                stage.setScene(scene1);
             
            }
        }
    }
 
    @Override
    public void start(Stage primaryStage) {
        root1 = new Group();
        root2 = new Group();
     
        stage=primaryStage;
        bh = new ButtonHandler();
     
        btnToScene2 = new Button("Switch To Scene 2");
        btnToScene2.setOnAction(bh);
        root1.getChildren().add(btnToScene2);
        scene1 = new Scene(root1, 250, 250, Color.BISQUE);
     
        btnToScene1 = new Button("Switch To Scene 1");
        btnToScene1.setOnAction(bh);
        root2.getChildren().add(btnToScene1);
        scene2 = new Scene(root2, 250, 250, Color.BLACK);
     
     
        stage.setTitle("Switcher");
        stage.setScene(scene1);
        stage.show();

     
    }

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

Scene : Beberapa Method yang Penting dan Bertukar Scene

Scene

Didalam aplikasi JavaFX paling tidak terdapat sebuh object scene yang diletakkan didalam stage. Scene ini mengikat bermacam-macam control dan node yang ditampilkan melalui object Stage.
  • Beberapa method yang penting adalah :
    • Konstruktor 
      • Scene(Parent root)
      • Scene(Parent root, double width, double height) 
    • double getHeight() mengambil nilai tinggi scene
    • double getWidth() mengambil nilai lebar scene.
    • double getX() mengambil posisi horisontal scene
    • double getY() mengambil posisi vertikal scene.
    • void setRoot(Parent root) menentukan root node
  • Semua Konstruktor wajib memiliki root (dengan nama apapun). Selanjutnya nanti root dapat ditukar dengan setRoot()
  • Turunan Node yang dapat memiliki children adalah Parent
  • Ukuran awal ditentukan dengan nilai width dan height
  • Ukuran Scene dapat diketahui dengan getWidth dan getHeight
  • UKURAN Scene menentukan UKURAN Stage
  • Jika UKURAN object Stage dirubah, maka UKURAN object Scene juga berubah

Bertukar Scene

Pada bagian ini saya akan menuliskan prinsip dasar program dimana setiap kali saya menekan button maka akan dilakukan perubahan scene :
  1. Buat variable berjenis Stage untuk menyimpan primaryStage. Variable ini merupakan class field
  2. Buat paling tidak dua reference variable berjenis Scene
  3. Buat bermacam-macam reference variable untuk kontrol dari masing masing scene
  4. Buat paling tidak sebuah reference variable berjenis StackPane atau Group
  5. Semua variable diinisiasi pada method start
  6. Lalu algoritma untuk berpindah scene : menggunakan method Stage.setScene() 
Posting berikutnya berisi kode program untuk berpindah scene.

Stage : Beberapa Method yang penting

Pada bagian Sebelumnya disebutkan bahwa sebuah aplikasi JavaFX paling tidak memiliki sebuah stage.

Ketika sebuah aplikasi JavaFX dijalankan sebuah object Stage secara otomatis dibuat. Referensi ke object Stage menjadi argumen dari method start :
....
....@Override public void start(Stage primaryStage)
{
//primaryStage merupakan reference variable menunjuk ke
//object Stage dari sebuah aplikasi JavaFX
}
....
....
Stage digunakan untuk mengikat object Scene yang berisi banyak control dan banyak node
Stage memiliki banyak method. Adapun method yang paling banyak digunakan adalah
    • void close()
    • void initModality(Modality modality) 
    • void initStyle(StageStyle style)
    • void getMaxHeight(double maxheight)
    • void getMaxWidth(double maxwidth)
    • void getMinHeight(double maxheight)
    • void getMinWidth(double maxwidth)
    • void setFullScreen(boolean fullscreen)
    • void setIconified(boolean iconified)
    • void setMaximized(boolean maximized)
    • void setMaxHeight(double maxheight) 
    • void setMaxWidth(double maxwidth) 
    • void setMinHeight(double maxheight) 
    • void setMinWidth(double maxwidth) 
    • void setResizable(boolean resizable) 
    • void setScene(Scene scene) 
    • void setTitle(String title) 
    • void show()
    • void showAndWait() 
    • void toFront() 
    • void toBack() 

  • Dari keseluruhan method yang disebutkan diatas : setScene, setTitle, dan show() adalah method yang paling sering digunakan.


  • Supaya tidak bisa dirubah ukuran windows dari aplikasi gunakan setResizable(false)
  • Jika stage bisa dirubah ukuran windowsnya, dengan ukuran maksimum dan minimum tertentu gunakan beberapa method berikut :
    • void setMaxHeight(double maxwidth)
    • void setMaxWidth(double maxwidth)
    • void setMinHeight(double maxheight)
    • void setMinWidth(double maxwidth)
    • void setResizable(boolean resizable)
  • Jika ingin aplikasi menutupi seluruh layar gunakan method berikut : void setFullScreen(boolean fullscreen)
  • Jika ingin membuat windows maximized gunakan method berikut : void setMaximized(boolean maximized)
  • Jika ingin dikecilkan menjadi sebuah icons gunakan method : void setIconified(boolean iconified)
  • void initModality(Modality modality) dan void initStyle(StageStyle style) hanya dapat dijalankan sebelum show