Monday, November 24, 2025

Pertemuan 14 | Gui

 Nama : Naufal Daffa Alfa Zain

NRP    : 5025241066

Kelas   : Pemrograman Berbasis Objek - A2

    Pada pertemuan ke 14 ini kami diminta membuat form login dan aplikasi Simple Image Viewer dengan menggunakan GUI. GUI sendiri berfungsi agar interaksi pengguna lebih mudah dan intuitif karena setiap fitur ditampilkan sebagai komponen visual yang bisa langsung diklik.

Latihan 1

Membuat frame dalam windows untuk login menggunakan username dan password, lalu mengecek apakah valid atau tidak








Source Code : 

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

public class LoginForm extends JFrame implements ActionListener {
    private final JTextField usernameField = new JTextField(15);
    private final JPasswordField passwordField = new JPasswordField(15);
    private final JButton loginButton = new JButton("Login");

    public LoginForm() {
        super("Login");
        buildUi();
    }

    private void buildUi() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setResizable(false);

        JPanel panel = new JPanel(new GridBagLayout());
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.insets = new Insets(5, 5, 5, 5);
        gbc.anchor = GridBagConstraints.WEST;

        gbc.gridx = 0;
        gbc.gridy = 0;
        panel.add(new JLabel("Username"), gbc);

        gbc.gridx = 1;
        panel.add(usernameField, gbc);

        gbc.gridx = 0;
        gbc.gridy = 1;
        panel.add(new JLabel("Password"), gbc);

        gbc.gridx = 1;
        panel.add(passwordField, gbc);

        loginButton.addActionListener(this);

        gbc.gridx = 0;
        gbc.gridy = 2;
        gbc.gridwidth = 2;
        gbc.fill = GridBagConstraints.HORIZONTAL;
        panel.add(loginButton, gbc);

        add(panel);
        pack();
        setLocationRelativeTo(null);
    }

    private void attemptLogin() {
        String username = usernameField.getText().trim();
        String password = new String(passwordField.getPassword());

        if ("admin".equals(username) && "password".equals(password)) {
            JOptionPane.showMessageDialog(this, "Login berhasil!", "Sukses", JOptionPane.INFORMATION_MESSAGE);
        } else {
            JOptionPane.showMessageDialog(this, "Username atau password salah.", "Gagal", JOptionPane.ERROR_MESSAGE);
        }
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == loginButton) {
            attemptLogin();
        }
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> new LoginForm().setVisible(true));
    }
}

Latihan 2

ImageViewer membuka jendela “Simple Image Viewer” dengan tiga tombol: memilih gambar dari file chooser, memperbesar, dan memperkecil. Setelah gambar dipilih, ia ditampilkan GUI dan setiap klik zoom akan menghitung ulang ukuran dengan faktor baru sehingga pengguna dapat melihat gambar secara lebih detail atau lebih kecil.









Source Code :

import java.awt.*;
import java.awt.event.*;
import java.io.File;
import javax.swing.*;
import javax.swing.filechooser.FileNameExtensionFilter;

public class ImageViewer extends JFrame implements ActionListener {
    private final JLabel imageLabel = new JLabel("", SwingConstants.CENTER);
    private final JButton openButton = new JButton("Open Image");
    private final JButton zoomInButton = new JButton("Zoom In");
    private final JButton zoomOutButton = new JButton("Zoom Out");

    private Image originalImage;
    private double zoomFactor = 1.0;

    public ImageViewer() {
        super("Simple Image Viewer");
        initUi();
    }

    private void initUi() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLayout(new BorderLayout(10, 10));

        JPanel controlPanel = new JPanel(new FlowLayout(FlowLayout.CENTER));
        controlPanel.add(openButton);
        controlPanel.add(zoomInButton);
        controlPanel.add(zoomOutButton);
        add(controlPanel, BorderLayout.NORTH);

        JScrollPane scrollPane = new JScrollPane(imageLabel);
        add(scrollPane, BorderLayout.CENTER);

        openButton.addActionListener(this);
        zoomInButton.addActionListener(this);
        zoomOutButton.addActionListener(this);

        setSize(600, 450);
        setLocationRelativeTo(null);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        Object source = e.getSource();

        if (source == openButton) {
            openImage();
        } else if (source == zoomInButton) {
            adjustZoom(0.1);
        } else if (source == zoomOutButton) {
            adjustZoom(-0.1);
        }
    }

    private void openImage() {
        JFileChooser chooser = new JFileChooser();
        chooser.setFileFilter(new FileNameExtensionFilter("Image Files", "jpg", "jpeg", "png", "gif", "bmp"));

        if (chooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) {
            File file = chooser.getSelectedFile();
            ImageIcon icon = new ImageIcon(file.getAbsolutePath());

            if (icon.getIconWidth() > 0 && icon.getIconHeight() > 0) {
                originalImage = icon.getImage();
                zoomFactor = 1.0;
                updateImage();
            } else {
                JOptionPane.showMessageDialog(this, "File tidak dapat dibuka sebagai gambar.", "Error", JOptionPane.ERROR_MESSAGE);
            }
        }
    }

    private void adjustZoom(double delta) {
        if (originalImage == null) {
            JOptionPane.showMessageDialog(this, "Buka gambar terlebih dahulu.", "Info", JOptionPane.INFORMATION_MESSAGE);
            return;
        }

        double newFactor = zoomFactor + delta;
        newFactor = Math.max(0.2, Math.min(newFactor, 3.0));
        if (newFactor != zoomFactor) {
            zoomFactor = newFactor;
            updateImage();
        }
    }

    private void updateImage() {
        int width = (int) (originalImage.getWidth(null) * zoomFactor);
        int height = (int) (originalImage.getHeight(null) * zoomFactor);

        if (width <= 0 || height <= 0) {
            return;
        }

        Image scaled = originalImage.getScaledInstance(width, height, Image.SCALE_SMOOTH);
        imageLabel.setIcon(new ImageIcon(scaled));
        imageLabel.setText("");
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> new ImageViewer().setVisible(true));
    }
}




Sunday, November 23, 2025

Pertemuan 12 | CRUD upload image

 Nama : Naufal Daffa Alfa Zain

 NRP   : 5025241066

 Kelas  : Pemrograman Web B2  

     pada pertemuan 12 saya diminta untuk mengaplikasikan CRUD ke dalam sebuah aplikasi web sederhana dengan PHP, MySQL/MariaDB, dan fitur upload foto. Disini saya menggunakan PHP built-in server di http://127.0.0.1:8181, database pertemuan12 dengan tabel siswa (kolom id, nis, nama, jenis_kelamin, telp, alamat, foto),serta folder images/ untuk menyimpan file yang diunggah. 

    Alurnya: halaman utama index.php menampilkan daftar siswa beserta foto, form form_simpan.php menambah data baru dan menyimpan foto dengan nama unik, form_ubah.php memungkinkan edit data serta ganti foto (foto lama dihapus bila diganti), dan proses_hapus.php menghapus data beserta file fotonya. Semua operasi langsung memodifikasi database dan filesystem sesuai input pengguna, sehingga CRUD dan upload dapat diuji end-to-end dari browser.

 

 

 

 

 

 

 

 

 

 

Untuk Source code dapat dilihat di

Source Code 

Monday, November 17, 2025

Pertemuan 12 | Rental Kendaraan

Nama : Naufal Daffa Alfa Zain

NRP   : 5025241066

Kelas : Pemrograman Berbasis Objek A

    Pada pertemuan ke dua belas mata kuliah Pemrograman Berorientasi Objek (PBO A), kami diminta untuk membuat dan menjalankan proyek sistem Rental Kendaraan menggunakan bahasa Java di platform BlueJ. Program ini merupakan aplikasi berbasis konsol sederhana yang mensimulasikan proses penyewaan kendaraan, di mana pengguna dapat melihat daftar kendaraan, memilih jenis kendaraan untuk disewa, memproses penyewaan dan pengembalian, serta melihat status dan detail kendaraan yang tersedia. Melalui proyek ini, kita dilatih untuk memahami penerapan pewarisan (inheritance) dan hubungan antarkelas dalam sebuah sistem informasi kecil.



Source Code:
Main.Java

public class Main {
    public static void main(String[] args) {
        Rental rental = new Rental();
        rental.tambahKendaraan(new Sepeda("Sepeda Gunung", "Polygon", "SP-01", 5000));
        rental.tambahKendaraan(new Motor("Motor Matic", "Honda Beat Street", "MT-02", 10000));
        rental.tambahKendaraan(new Motor("Motor Matic", "Honda Beat Street", "MT-03", 10000));
        rental.tambahKendaraan(new Motor("Motor Matic", "Aerox", "MT-04", 15000));
        rental.tambahKendaraan(new Mobil("Mobil Listrik", "Omoda E5", "MB-03", 30000));
        rental.tambahKendaraan(new Mobil("Mobil Big Size", "Daihatsu Xenia", "MB-04", 25000));

        rental.tampilkanKendaraan();

        Penyewa penyewa1 = new Penyewa("Andi", "0812-3456-7890");
        Penyewa penyewa2 = new Penyewa("Budi", "0823-4567-8901");
        rental.sewa("MB-04", penyewa1, 24);
        rental.sewa("MT-02", penyewa2, 10);

        rental.tampilkanKendaraan();
    }
}


Kendaraan.Java

public class Kendaraan {
    protected String nama;
    protected String merk;
    protected String platNomor;
    protected double tarifPerJam;
    protected boolean tersedia = true;

    public Kendaraan(String nama, String merk, String platNomor, double tarifPerJam) {
        this.nama = nama;
        this.merk = merk;
        this.platNomor = platNomor;
        this.tarifPerJam = tarifPerJam;
    }

    public String getPlatNomor() {
        return platNomor;
    }

    public boolean isTersedia() {
        return tersedia;
    }

    public void setTersedia(boolean status) {
        this.tersedia = status;
    }

    public double hitungBiaya(int jumlahJam) {
        return tarifPerJam * jumlahJam;
    }

    public String info() {
        return nama + " " + merk + " (" + platNomor + ") - " + (tersedia ? "tersedia" : "disewa");
    }
}


Motor.Java

public class Motor extends Kendaraan {
    public Motor(String nama, String merk, String platNomor, double tarifPerJam) {
        super(nama, merk, platNomor, tarifPerJam);
    }

    @Override
    public double hitungBiaya(int jumlahJam) {
        double biaya = super.hitungBiaya(jumlahJam);
        return biaya + 5000;
    }
}


Mobil.Java

public class Mobil extends Kendaraan {
    public Mobil(String nama, String merk, String platNomor, double tarifPerJam) {
        super(nama, merk, platNomor, tarifPerJam);
    }

    @Override
    public double hitungBiaya(int jumlahJam) {
        return super.hitungBiaya(jumlahJam) * 1.2;
    }
}


Sepeda.Java

public class Sepeda extends Kendaraan {
    public Sepeda(String nama, String merk, String platNomor, double tarifPerJam) {
        super(nama, merk, platNomor, tarifPerJam);
    }

    @Override
    public double hitungBiaya(int jumlahJam) {
        double biaya = super.hitungBiaya(jumlahJam);
        return biaya * 0.8;
    }
}


Penyewa.Java

public class Penyewa {
    private final String nama;
    private final String noHp;

    public Penyewa(String nama, String noHp) {
        this.nama = nama;
        this.noHp = noHp;
    }

    public String getNama() {
        return nama;
    }

    public String getNoHp() {
        return noHp;
    }
}


Rental.Java

import java.util.ArrayList;
import java.util.List;

public class Rental {
    private final List<Kendaraan> daftarKendaraan = new ArrayList<>();

    public void tambahKendaraan(Kendaraan kendaraan) {
        daftarKendaraan.add(kendaraan);
    }

    public void tampilkanKendaraan() {
        System.out.println("Daftar kendaraan:");
        for (Kendaraan kendaraan : daftarKendaraan) {
            System.out.println("- " + kendaraan.info());
        }
    }

    public double sewa(String platNomor, Penyewa penyewa, int jumlahJam) {
        for (Kendaraan kendaraan : daftarKendaraan) {
            if (kendaraan.getPlatNomor().equalsIgnoreCase(platNomor) && kendaraan.isTersedia()) {
                kendaraan.setTersedia(false);
                double biaya = kendaraan.hitungBiaya(jumlahJam);
                System.out.println(penyewa.getNama() + " (" + penyewa.getNoHp() + ") menyewa " + kendaraan.info() + " selama " + jumlahJam + " jam.");
                System.out.println("Total biaya: " + biaya);
                return biaya;
            }
        }
        System.out.println("Kendaraan dengan plat " + platNomor + " tidak tersedia.");
        return 0;
    }

    public void kembalikan(String platNomor) {
        for (Kendaraan kendaraan : daftarKendaraan) {
            if (kendaraan.getPlatNomor().equalsIgnoreCase(platNomor) && !kendaraan.isTersedia()) {
                kendaraan.setTersedia(true);
                System.out.println("Kendaraan " + platNomor + " telah dikembalikan.");
                return;
            }
        }
        System.out.println("Tidak ditemukan kendaraan untuk dikembalikan.");
    }
}

Monday, November 3, 2025

Pertemuan 11 | Unit Testing

 Naufal Daffa Alfa Zain                                                                                                           5025241066                                                                                                                                 Pemrograman Berorientasi Objek – A

Pada pertemuan kesebelas mata kuliah Pemrograman Berorientasi Objek (PBO A), kami melanjutkan latihan pemahaman konsep OOP dengan membuat program bernama SalesItem menggunakan bahasa Java di platform BlueJ. Program ini bertujuan untuk mensimulasikan sistem ulasan (review system) pada suatu produk, di mana pengguna dapat memberikan komentar, rating, serta melakukan upvote dan downvote terhadap komentar yang ada.

Program terdiri dari tiga kelas utama yaitu SalesItem, Comment, dan SalesItemTest. Kelas SalesItem berfungsi sebagai representasi suatu produk yang dijual, menyimpan nama barang, harga, serta daftar komentar yang diberikan pengguna. Kelas Comment merepresentasikan satu ulasan dari pengguna yang terdiri dari nama penulis, isi komentar, rating, dan jumlah suara. Sementara kelas SalesItemTest berperan sebagai kelas penguji yang menjalankan berbagai skenario untuk memastikan fungsi-fungsi dalam program berjalan sebagaimana mestinya.

Melalui program ini, pengguna dapat menambahkan komentar dengan validasi tertentu — seperti rating yang harus berada dalam rentang 1 hingga 5 dan tidak boleh ada dua komentar dari penulis yang sama. Selain itu, setiap komentar dapat diberi upvote atau downvote yang memengaruhi keseimbangan suara (vote balance). Program juga mampu menampilkan komentar yang dianggap paling membantu, yaitu komentar dengan nilai vote balance tertinggi.



Source Code Lengkap

SalesItem

import java.util.ArrayList;

public class SalesItem {
    private String name;
    private int price;
    private ArrayList<Comment> comments;

    public SalesItem(String name, int price) {
        this.name = name;
        this.price = price;
        this.comments = new ArrayList<Comment>();
    }

    public boolean addComment(String author, String text, int rating) {
        if (rating < 1 || rating > 5) {
            return false; // rating tidak valid
        }

        for (Comment comment : comments) {
            if (comment.getAuthor().equals(author)) {
                return false;
            }
        }

        Comment newComment = new Comment(author, text, rating);
        comments.add(newComment);
        return true;
    }

    public boolean removeComment(Comment comment) {
        return comments.remove(comment);
    }

    public int getNumberOfComments() {
        return comments.size();
    }

    public void showInfo() {
        System.out.println("=================================");
        System.out.println("Item: " + name);
        System.out.println("Price: " + price);
        System.out.println("Number of comments: " + getNumberOfComments());
        System.out.println("---------------------------------");

        for (Comment comment : comments) {
            comment.print();
            System.out.println();
        }
    }

    public Comment findMostHelpfulComment() {
        if (comments.isEmpty()) {
            return null;
        }

        Comment best = comments.get(0);
        for (Comment current : comments) {
            if (current.getVoteBalance() > best.getVoteBalance()) {
                best = current;
            }
        }
        return best;
    }
   
    //Method tambahan untuk testing
    public Comment getCommentByAuthor(String author) {
    for (Comment comment : comments) {
        if (comment.getAuthor().equals(author)) {
            return comment;
        }
    }
    return null;
    }

}

SalesItemTest

public class SalesItemTest {
    public static void main(String[] args) {
        SalesItem item = new SalesItem("Rice Cooker Serbaguna", 300000);

        item.addComment("Andi", "Nasinya jadi pulen dan enak", 5);
        item.addComment("Andi", "Mau nambahin review lain.", 4); //ga bisa karena author sama dengan sebelumnya
        item.addComment("Budi", "Kurang bagus", 6); //ga valid
        item.addComment("Citra", "Nasinya cepat basi jika disimpan agak lama", 3);

        System.out.println("\n=== Informasi Item ===");
        item.showInfo();
       
        Comment andiComment = item.getCommentByAuthor("Andi");
        if (andiComment != null) {
            System.out.println("Menambah upvote pada komentar Andi");
            andiComment.upvote();
            System.out.println("Menambah upvote pada komentar Andi");
            andiComment.upvote();
            System.out.println("Menambah downvote pada komentar Andi");
            andiComment.downvote();
        } else {
            System.out.println("Komentar Andi tidak ditemukan.");
        }
       
        System.out.println("");
       
         Comment citraComment = item.getCommentByAuthor("Citra");
        if (citraComment != null) {
            System.out.println("Menambah upvote pada komentar Citra");
            citraComment.upvote();
            System.out.println("Menambah upvote pada komentar Citra");
            citraComment.upvote();
            System.out.println("Menambah downvote pada komentar Citra");
            citraComment.downvote();
            System.out.println("Menambah downvote pada komentar Citra");
            citraComment.downvote();
        } else {
            System.out.println("Komentar Citra tidak ditemukan.");
        }

        System.out.println("\n=== Komentar Paling Membantu ===");
        Comment best = item.findMostHelpfulComment();
        if (best != null) {
            best.print();
        } else {
            System.out.println("Belum ada komentar.");
        }
    }
}

Comment

public class Comment {
    private String author;
    private String text;
    private int rating;
    private int upvotes;
    private int downvotes;

    public Comment(String author, String text, int rating) {
        this.author = author;
        this.text = text;
        this.rating = rating;
        this.upvotes = 0;
        this.downvotes = 0;
    }

    public String getAuthor() {
        return author;
    }

    public void upvote() {
        upvotes++;
    }

    public void downvote() {
        downvotes++;
    }

    public int getVoteBalance() {
        return upvotes - downvotes;
    }

    public void print() {
        System.out.println("Author: " + author);
        System.out.println("Rating: " + rating);
        System.out.println("Comment: " + text);
        System.out.println("Votes: " + getVoteBalance());
    }
}

Pertemuan 13 | Abstract Class

 Nama     : Naufal Daffa Alfa Zain  Nrp         : 5025241066  Kelas      : Pemrograman Web A2 Pada pertemuan ke‑13 kami mendapat dua tugas. ...