Sabtu, 20 April 2019

DATABASE CURD JAVA

CRUD adalah akronim untuk Create, Read, Update, dan Delete. Operasi CRUD adalah manipulasi data dasar untuk database.
 Dalam pemrograman komputer , membuat, membaca, memperbarui, dan menghapus [1] ( CRUD ) adalah empat fungsi dasar penyimpanan persisten . [2] Kata-kata alternatif kadang-kadang digunakan saat mendefinisikan empat fungsi dasar CRUD , seperti mengambil alih-alih membaca , mengubah alih-alih memperbarui , atau menghancurkan alih-alih menghapus . CRUD juga terkadang digunakan untuk menggambarkan konvensi antarmuka pengguna yang memfasilitasi tampilan, pencarian, dan perubahan informasi ; sering menggunakan formulir dan laporan berbasis komputer. Istilah ini kemungkinan pertama kali dipopulerkan oleh James Martin dalam bukunya 1983 Mengelola Lingkungan Data-base . [1] [3] Akronim ini dapat diperluas ke CRUDL untuk mencakup daftar set data besar yang membawa kompleksitas tambahan seperti pagination ketika set data terlalu besar untuk dengan mudah disimpan dalam memori.

CRUD (Create, Read, Update Delete) adalah fitur dasar yang harus kita buat saat bekerja dengan database.
Berikut ini daftar pekerjaannya…
TODO:

Ada lima method dalam class tersebut:

1. Method __construct()

Method __construct() merupakan sebuah konstruktor. Method ini yang akan dieksekusi pertama kali saat Controller diakses.
Pada method ini, kita melakukan load model (porduct_model) dan library (form_validation).

2. Method index()

Pada method ini, kita akan mengambil data dari model dengan memanggil method product_model->getAll().

3. Method add()

Method ini bertugas untuk menampilkan form add dan menyimpan data ke database. Tentunya dengan memanggil method save() yang ada pada model.
Namun, sebelum memanggil method save(), kita lakukan validasi terlebih dahulu dengan mengeksekusi method run() pada objek $validation.

4. Method edit()

Hampir sama dengan method add(), method edit() juga bertugas untuk menampilkan form dan menyimpan data.

5. Method delete()

Method delete() befungsi untuk menangni penghapusan data.
Prinsipnya hampir sama seperti method edit(), method delete() juga membutuhkan $id untuk menentukan data mana yang akan dihapus.


Tahap pertama adalah membuat project baru :

1. Buka projek baru dengan cara klik file =>  New Project
2. Pilih katagori: java dan project: java application.
3. Berikan nama project: sesuai dengan kebutuhan dan jangan lupa jangan lupa centang create main project lalu finish.
CREATE(INSERT)
 Untuk Create, masukkan coding berikut ke dalam class Main

package org.jaco.hibernate;
import java.util.Scanner;
import org.hibernate.Session;
import org.hibernate.cfg.Configuration;
public class Main {
    public static void main(String[] args) {
        //  Buat Session untuk Koneksi Database
        Session s = new Configuration().configure().buildSessionFactory().openSession();
         
        //  Buat Objek dari class Users
        Users user = new Users();
         
        //  Pilih jenis operasi CRUD
        System.out.println("Pilih Operasi 1CRUD");
        System.out.println("1. Create");
        System.out.println("2. Read");
        System.out.println("3. Update");
        System.out.println("4. Delete");
        System.out.print("Pilihan : ");     int pilih = new Scanner(System.in).nextInt();
         
        switch(pilih)
        {
            case 1  :   //  Create(Insert SQL)
                        //  set nilai untuk objek user
                        //  user.setID(null)    nggak perlu dibuat karena, Auto_Increment
                        user.setNama("Yudi");
                         
                        try
                        {
                            //  Mulai Koneksi
                            s.beginTransaction();
                             
                            //  Simpan Objek User ke Session
                            s.save(user);
                             
                            //  execute Session ke MySQL
                            s.getTransaction().commit();
                             
                        }catch(Exception e)
                        {
                            e.printStackTrace();
                        }
                         
                            break;
                             
            default :   System.out.println("Pilihan tidak tersedia");
                             
        }
    }
}

Contoh  Kasus:

package pemilu;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.sql.SQLException;
import javax.swing.JOptionPane;
 
public class Create extends javax.swing.JFrame {

    /** Creates new form Create */
    public Create() {
        initComponents();
    }

    @SuppressWarnings("unchecked") 
  private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                        
        String capres = String.valueOf(jTextField1.getText());
        String cawapres = String.valueOf(jTextField2.getText());
        String slogan = String.valueOf(jTextArea1.getText());
        if (capres.equals("")) {
            JOptionPane.showMessageDialog(null, "Anda Belum Mengisi Nama Capres!", "Input Data Status", 1);
        } else if (cawapres.equals("")) {
            JOptionPane.showMessageDialog(null, "Anda Belum Mengisi Nama CaWapres!", "Input Data Status", 1);
        } else if (slogan.equals("")) {
            JOptionPane.showMessageDialog(null, "Anda Belum Mengisi Slogan!", "Input Data Status", 1);
        } else { // jika data tidak ada yang kosong.
            try {
                Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/pemilu", "root", "");
                Statement st = conn.createStatement();
                String query = "INSERT INTO daftar_peserta VALUES (null,'" + capres + "','" + cawapres + "','" + slogan + "')";
                // harus diberi null, karena di database nya , kolom id itu AUTO INCREEMENT. null berarti tidak ada data yang masuk ke tabel
                st.executeUpdate(query);
                JOptionPane.showMessageDialog(null, "Data Berhasil Tersimpan!", "Input Data Status", 1);
            } catch (SQLException ex) {
                JOptionPane.showMessageDialog(null, "Terjadi Kesalahan! Periksa Kembali Data Anda! "+ex, "Input Data Status", 0);
            }
        }
    }
 
 
 

READ(SELECT)
Untuk Read, tambahkan coding berikut ke dalam file Main.class.

case 2  :   //  Read(Select SQL)
        s.beginTransaction();
        for(Users us :getAllUsers())
        {
            System.out.println(us);
        }
     
            break;
//  Method untuk select all from table
    public static List<Users> getAllUsers()
    {
        List<Users> list = null;
        Session session = new Configuration().configure().buildSessionFactory().openSession();
         
        try
        {
            session.beginTransaction();
            Query query = session.createQuery("from org.jaco.hibernate.Users");
            list = query.list();
            return list;
        }catch(Exception e)
        {
            e.printStackTrace();
            return null;
        }
    }

Contoh Kasus :
package pemilu;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.sql.SQLException;
import javax.swing.JOptionPane;
import javax.swing.table.DefaultTableModel;
public class Read extends javax.swing.JFrame {

    /** Creates new form Read */
    public Read() {
        initComponents();
        data(); // ini berfungsi untuk memanggil method yang memanggil data pada database
    }


    @SuppressWarnings("unchecked")
                        
    private void initComponents() {

        jScrollPane1 = new javax.swing.JScrollPane();
        jTable1 = new javax.swing.JTable();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        jTable1.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {
                {null, null, null},
                {null, null, null},
                {null, null, null},
                {null, null, null}
            },
            new String [] {
                "CaPres", "CaWapres", "Slogan"
            }
        ));
        jScrollPane1.setViewportView(jTable1);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 452, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 275, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(14, Short.MAX_VALUE))
        );

        pack();
    }                   

    public void data() {         try {
            Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/pemilu", "root", "");
            String query2 = "SELECT * FROM daftar_peserta";
            Statement st2 = conn.createStatement();
            ResultSet rs2 = st2.executeQuery(query2);
            DefaultTableModel tm = (DefaultTableModel) jTable1.getModel();
            tm.setRowCount(0);
            while (rs2.next()) {
                String capress = rs2.getString("capres");
                String cawapress = rs2.getString("cawapres");
                String slogann = rs2.getString("slogan");
                tm.addRow(new Object[]{capress, cawapress, slogann});
            }
        } catch (SQLException ex) {
            JOptionPane.showMessageDialog(null, "Terjadi Kesalahan! Periksa Kembali Data Anda!", "Input Data Status", 0);
        }
    }

                    
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JTable jTable1;
                     
}
 
 
 
 
 






UPDATE
Untuk update, tambahkan coding berikut ke dalam file Main.class.

case 3  :   //  Update(Update SQL)
        s.beginTransaction();
                         
        //  Set Query SQL
        Query query = s.createQuery("update org.jaco.hibernate.Users set nama = :nama where id = :id");
        query.setParameter("nama", "Setiawan");
        query.setParameter("id", 1);
        int exec = query.executeUpdate();
        s.getTransaction().commit();
                         
            break;
DELETE(DELETE SQL)
Untuk yang terakhir Delete, tambahkan coding berikut ke dalam file Main.class

case 4  :   //  Delete(Delete SQL)
        s.beginTransaction();
                         
        //  Set Query SQL
        query = s.createQuery("delete from org.jaco.hibernate.Users where id = :id");
        query.setParameter("id", 1);
        exec = query.executeUpdate();
        s.getTransaction().commit();
                         
            break;



Penjelasan dan fungsi events

penjelasan untuk fungsi setiap event adalah sebagai berikut :
a.  ActionEvent  :  Suatu  event  akan  terjadi  ketika  element  seperti  tombol  dikenai suatu action(klik,ditekan, dsb.) atau di tekan dengan tombol enter.
1.  actionPerformed  : Method yangSuatu  fungsi event yang digunakan ketika event Action terjadi.

b.  KeyEvent  : Suatu event akan terjadi ketika keyboard ditekan.
1.  keyPressed  :  Suatu  fungsi  event  yang  digunakan  ketika  pengguna  menekan tombol keyboard.
2.  KeyReleased  :  Suatu  fungsi  event  yang  digunakan  ketika  user melepas  tombol keyboard.
3.  keyTyped  :  Suatu  fungsi event  yang digunakan  ketika user mengetikkan  tombol keyboard.

c.  MouseEvent  : Suatu event akan terjadi ketika user Mengirimkan perintah dengan mouse.
1.  mouseClicked :  Suatu fungsi event yang digunakan ketika pengguna mengklik kiri mouse pada suatu element/ komponen seperti button dll.
2.  mouseEntered  :  Suatu  fungsi  event  yang  digunakan  ketika  mouse  digerakkan sehingga  berada  di  atas  komponen  pada  suatu  element/  komponen  seperti button dll.
3.  mousePressed : Suatu fungsi event yang digunakan ketika user menekan mouse.
4.  mouseRelease  :  Suatu  fungsi  event  yang  digunakan  ketika  user  melepaskan tombol mouse pada suatu element/ komponen seperti button.
 
d.  WindowEvent  :  Suatu  event  akan  terjadi  ketika  window  mengalami  perubahan keadaan.
1.  windowActived  :  Suatu  fungsi  event  yang  digunakan  ketika  jendela  aplikasi (window) diaktifkan.
2.  windowClosed  :  Suatu  fungsi  event  yang  digunakan  ketika  jendela  aplikasi ditutup.
3.  windowClosing : Suatu fungsi event yang digunakan ketika semua jendela aplikasi ditutup
4.  windowDeactivated  :  Suatu  fungsi event  yang digunakan  ketika  jendela  aplikasi tidak diaktifkan.


Swing adalah sebuah widget toolkit untuk java yang merupakan bagian dari Java Foundation Classes (JFC) dari Sun Microsystem. Swing adalah sebuah API (Application Programming Interface), yang menyediakan Graphical  User Interface (GUI) untuk program java dan applet. Swing digunakkan untuk dikembangkan untuk menyediakan komponen GUI yang lebih canggih dari komponen sebelumnya yang bernama AWT, dan bertujuan untuk mempermudah pengembangan aplikasi Java GUI. 
Komponen Swing

     Sebagaimana Diketahui, Komponen merupakan puncak hiraki dalam AWT. Sebagian besar nama class dalam Swing diawali dengan "J" seluruhnya merupakan subclass dari JComponent, yang menyediakan berbagai method turunan Container seperti JComboBox, JLabel, dan JPanel yang dikemas dalam satu paket bernama javax.swing, itulah sebabnya program menggunakan fitur Swing  menyertakan pernyataan import java.swing.*;.
Swing menyediakan banyak sekali komponen. Untuk yang pertama kita akan menggunakan komponen sederhana, diantaranya.
  • JLabel, digunakan untuk menampilkan tulisan dan ikon gambar ukuran kecil.
  • JTextField, digunakan untuk menerima input Teks.
  • JPasswordField, digunakan untuk menerima input teks yang bersifat rahasia.
  • JButton, digunakan untuk menampilkan tombol.
 JPanel mempunyai empat buah konstruktor yang digunakan untuk mengkonstruksi obyek panel secara berbeda. Dua konstruktor kelas JPanel yang sering digunakan di dalam program Java untuk mengkonstruksi obyek panel adalah sebagai berikut:
Konstruktor Kelas JPanel
Konstruktor Keterangan
JPanel() Mengkonstruksi obyek JPanel dengan FlowLayout sebagai layout manager default
JPanel(LayoutManager layout) Mengkontruksi obyek JPanel dengan menentukan layout manager.

Fitur Swing
1.      Komponen GUI lengkap :
Button, listbox, combobox, textarea, dan sebagainya
2.      Pluggable Look and Feel
Tampilan GUI dapat diubah sesuai dengan kehendak (tidak perlu mengikuti native sistem operasi)
3.      Data Transfer Antar Komponen
Drag and drop, copy and paste
4.      Internationalization
Proses desain aplikasi yang memungkinkan aplikasi dijalankan sesuai dengan preferensi tanpa rekompilasi
5.      Localization
Proses translasi teks ke bahasa dan menambahkan komponen lokal


Berikut ini contoh program Java untuk mendemonstrasikan bagaimana penanganan event terkait tombol. Program akan mendeteksi penekanan setiap tombol keyboard. Class Listener yang digunakan adalah KeyListener yang memiliki 3 (tiga) buah method abstract keyTyped(), keyPressed() dan keyReleased().
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class KeyEventTest extends JFrame implements KeyListener {
 private String baris1="", baris2="", baris3="";
 private JTextArea textArea;
 
 public KeyEventTest() {
  super ("Mencoba Key Event");
  
  textArea = new JTextArea (10,15);
  textArea.setText("Tekan sembarang tombol di keyboard...");
  textArea.setEnabled(false);
  textArea.setDisabledTextColor(Color.BLACK);
  getContentPane().add(textArea);
  
  addKeyListener (this);
  
  setSize (300,150);
  setLocationRelativeTo(null);
  setVisible(true);
 }
 
 public void keyPressed (KeyEvent e) {
  baris1 = "Tombol yang ditekan : " + e.getKeyText(e.getKeyCode());
  setLines2and3 (e);
 }
 
 public void keyReleased (KeyEvent e) {
  baris1 = "Tombol yang dilepas : " + e.getKeyText(e.getKeyCode());
  setLines2and3 (e);
 }
 
 public void keyTyped (KeyEvent e) {
  baris1 = "Tombol yang ditulis : " + e.getKeyChar();
  setLines2and3 (e);
 }
 
 private void setLines2and3 (KeyEvent e) {
  baris2 = "This key is "+ (e.isActionKey() ? "" : "not ") + "an action key";
  String temp = e.getKeyModifiersText(e.getModifiers());
  baris3 = "Modifier key pressed : " + (temp.equals("") ? "none" : temp);
  textArea.setText(baris1 + "\n" + baris2 + "\n" + baris3 + "\n");
 }
 
 public static void main (String args[]) {
      KeyEventTest test = new KeyEventTest();
      test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     }
}
Sumber : 
https://www.termasmedia.com/pemrograman/java/180-menggunakan-kelas-jpanel-di-java.html
https://syayufribadriansyah.wordpress.com/kuliah/pemrograman-visual/penjelasan-dan-fungsi-events-pada-netbeans/
http://egi.degenius.id/berkenalan-dengan-swing-pada-java/

Jumat, 19 April 2019

PENGANTAR GUI


Java GUI adalah pemrograman dengan bahasa Java yang dibuat menggunakan aplikasi yang berbasiskan GUI. Tujuannya adalah menambahkan komponen-komponen yang tidak bisa dibuat dalam basis text. Komponen-konponen tersebut bisa berupatombol, gambar, dll. Tujuannya adalah untuk memudahkan user menggunakan programyang dibuat tersebut.Dalam Java, terdapat dua paket yang dapat digunakan untuk mengembangkan program-program GUI, yaitu AWT dan Swing. komponen-komponenAWT di-import dari library java.awt.* dan untuk swing di-import dari javax.swing.*.tetapi kita bisa menggabungkannya.

JAVA GUI
JAVA GUI sendiri secara umum sama dengan pemahaman GUI sendiri, namun disini GUI pada JAVA adalah salah satu dari fasilitas Java dalam mengembangkan suatu aplikasi dengan memberikan suatu interface yang nantinya akan disesuaikan dengan kebutuhan suatu aplikasi, baik skala kecil dan besar. Intinya, GUI pada Java adalah komponen-komponen penyempurna dalam sebuah sistem, seperti komponen navigasi, graphic, interface desktop, komponen menu, sinkronisasi antar interface dan semuanya itu dirancang dengan penelitian yang baik, dimana nantinya aplikasi tersebut dapat dengan mudah dioperasikan user. Banyak sudah aplikasi yang telah Java kembangankan dengan menggunakan GUI sebagai nilai penggunaan dan nilai jual. Software perangkat lunak dan keras juga termasuk di dalamnya. Java GUI adalah program pengembangan suatu user interface dengan mengetengahkan graphic sebagai penghubung user dengan sistem, sehingga mudah dalam implementasi aplikasi sistem tersebut.

beberapa fungsi dari penggunaan GUI:
(1). Pointing device dengan perangkat berupa mouse
(2). Memiliki fungsi sebagai plug and play, yang mana memudahkan user dalam menginstall dan uninstall hardware/sofware (sinkronisasi)
(3). Membuat software-software yang menuntut aplikasi dalam komputer user yang dapat digunakan untuk kegiatan user dalam proses seperti menulis text, spreadsheet. sound, graphic dan lain-lain
(4). Untuk digunakan dalam pembuatan System Operasi sebagai User friendly dan ergonomis
(5). Pembuatan website
(6). Opensource software/hardware atau pengembang aplikasi-aplikasi skala besar lainnya.

                                                                      GUI Pada Java 
Pengantar  
- GUI (Graphical User Interface), memungkinkan user untuk berinteraksi dengan komputer secara lebih baik.
- Pengguna berinteraksi dengan berbagai elemen grafis,diantaranya: button, dialog box, menu, dsb.
- Sejak 1994 Sun Microsystem berupaya untuk membuat JAVA memiliki perangkat bergaya desktop dengan ToolkitJAVA yang dikenal sebagai AWT (Abstract Windowing Toolkit)
- Tahun 1997, muncul JFC (Java Foundation Class) untuk kepentingan pembuatan aplikasi Window yang merupakan pengembangan dari AWT.  

- JFC mempunyai kode swing yang terdapat pada package yang disediakan pada JAVA SDK versi 1.2 ke atas (JAVA 2)
- JAVA menyediakan dua graphical library.
             AWT (Abstract Windows Toolkit)
            Swing
- Contoh:  import java.awt.* ;    

                   Import java.awt.event.* ;  
                   Import javax.swing.* ;  


Graphical Object
- Container (tempat), obyek yang dapat menampung komponen grafis dan tempat yang lebih kecil 

Contoh: frames, panels 

- Component, obyek grafis yang berfungsi untuk menampilkan data, menerima masukan, atau menunjukkan suatu kondisi. 

Contoh: buttons, labels, text fields 

- Event, obyek yang merepresentasikan suatu kejadian. Contoh: gerakan mouse, penekanan tombol 

- Listener, suatu obyek yang menunggu suatu kejadian khusus dan akan bereaksi (melakukan sesuatu) jika kejadian tersebut terjadi 



Sumber :https://momotarokun.wordpress.com/2009/10/06/pemahaman-java-gui-graphical-user-interface/
http://belajaranakinformatika.blogspot.com/2016/04/gui-graphical-user-interface-di-jav.html 
Hermawan, Beni. Menguasai Java 2 & Object oriented Programming,Penerbit Andi Yogyakarta, 2004. 

Senin, 15 April 2019

Array dan Blok Eksepsi
Hasil gambar untuk array java 
  • Array
1.Sebuah tipe data bentukan yang terdiri dari sejumlah komponen dengan tipe yang sama. 
2. Sebuah tipe data bentukan yang terdiri dari sejumlah komponen dengan tipe yang sama.
3. Konsep array adalah menyimpan setiap nilai ke dalam tiap blok yang disebut indeks.
4. Setiap indeks dimulai dari 0 dan seterusnya.

Array
  • Deklarasi umum aray adalah :
  • Tipe_data nama_variabel[jumlah_Indeks];
  • Contoh:
                    int nilai [5]; // jumlah indeks dapat tidak ditulis meskipun belum diinisialisasi.

                    String [] nilai = new String[5]; // harus ditulis jumlah indeks jika belum diinisialisasi.
  • Jumlah indeks dapat ditulis ataupun tidak ditulis.
  • Jumlah indeks berarti menentukan batas maksimal untuk menyimpan nilai ke dalam setiap indeks.
  • Tanpa penulisan jumlah indeks, jumlah indeks menjadi dinamis (bergantung kepada jumlah nilai yang tersimpan).
 
Contoh Inisialisasi Array:
          int nilai[] = {7,8,9,10,6};
          String [] nilai1 = new String[]{"1","2"};
 
Array (Cara Pengaksesan Indeks)   
 
 
Array Multidimensi 
  • Bentuk Kompleks dari Array.
  • Pengaksesan nilai dalam array menggunakan indeks baris dan kolom.
  • Bentuk deklarasinya : variable[][]
  • Utamanya digunakan untuk operasi Matriks.
  

Blok Eksepsi 
1. Merupakan keadaan tidak normal (abnormal) saat program tersebut dijalankan.
2. Ketika terjadi suatu eksepsi, maka dibutuhkan suatu objek tertentu untuk penanganan eksepsi tersebut.
3. Terdapat beberapa metode untuk penanganan Eksepsi, yaitu: try…catch, throw, throws dan finally.
 
Try…Catch
  • Bentuk dasar penanganan sebuah kondisi abnormal dari program.
  • Ketika terjadi satu eksepsi, maka blok catch akan “menangkapnya“ tanpa menghentikan program.
  • Jika tidak terjadi suatu eksepsi, maka blok try yang akan dijalankan. 
 
Throw
  • Throw digunakan secara eksplisit untuk melemparkan suatu kondisi.
  • Aliran eksekusi akan segera terhenti apabila telah mencapai pernyataan throw.
  • Throw dibuat secara manual oleh programmer yang artinya kita dapat menentukan kapan kondisi throw terjadi. 
 
Throws
  • Solusi apabila sebuah method dapat menyebabkan terjadinya eksepsi, namun tidak dapat “menangkapnya”.
  • Method lain dibuat untuk menangkap eksepsi tersebut. 
 
 Finally
Kondisi Finally akan dieksekusi, meskipun tidak terjadi suatu eksepsi.
 

iriport

iReport adalah utilitas (perkakas) pelaporan, yang dikembangkan di lingkungan Java guna membantu user dan developer (pengembang/programm...