Object Oriented Programming | Week 4: Membuat GUI Clock Display
PBO-A 2025
Pada pertemuan minggu keempat pemrograman berorientasi objek dibahas konsep mengenai abstraction dan modularization. Dua konsep ini merupakan pondasi penting dalam OOP agar kode yang dibuat lebih rapi, terstruktur dan mudah dipahami. Abstraction memungkinkan kita untuk menyembunyikan detail implementasi yang rumit. Sementara itu, modularization menekankan bagaimana suatu program yang besar dipecah menjadi beberapa bagian-bagian kecil yang independen namun saling terhubung.
Sebagai latihan praktis, saya membuat proyek sederhana yaitu dengan membuat GUI Clock Display. Proyek ini membutuhkan 3 class utama, yaitu NumberDisplay, ClockDisplay, dan Clock.
Class NumberDisplay:
public class NumberDisplay
{
private int limit;
private int value;
public NumberDisplay(int rollOverLimit) {
limit = rollOverLimit;
value = 0;
}
public int getValue() {
return value;
}
public String getDisplayValue() {
if(value < 10) {
return "0" + value;
} else {
return "" + value;
}
}
public void setValue(int replacementValue) {
if((replacementValue >= 0) && (replacementValue < limit)) {
value = replacementValue;
}
}
public void increment() {
value = (value + 1) % limit;
}
}
Class di atas merepresentasikan display nomor digital yang nilainya dimulai dari 0 sampai limit yang diberikan.
Class ClockDisplay:
public class ClockDisplay
{
private NumberDisplay hours;
private NumberDisplay minutes;
private NumberDisplay seconds;
private String displayString;
public ClockDisplay() {
hours = new NumberDisplay(24);
minutes = new NumberDisplay(60);
seconds = new NumberDisplay(60);
updateDisplay();
}
public ClockDisplay(int hour, int minute, int second) {
hours = new NumberDisplay(24);
minutes = new NumberDisplay(60);
seconds = new NumberDisplay(60);
setTime(hour, minute, second);
}
public void timeTick() {
seconds.increment();
if(seconds.getValue() == 0) {
minutes.increment();
}
if(minutes.getValue() == 0 && seconds.getValue() == 0) {
hours.increment();
}
updateDisplay();
}
public void setTime(int hour, int minute, int second) {
hours.setValue(hour);
minutes.setValue(minute);
seconds.setValue(second);
updateDisplay();
}
public String getTime() {
return displayString;
}
private void updateDisplay() {
displayString = hours.getDisplayValue() + ":" + minutes.getDisplayValue() + ":" + seconds.getDisplayValue();
}
}
Class di atas merepresentasikan jam digital yang mengikuti format European-style dengan 24 jam dalam 1 hari.
Class Clock:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;
public class Clock
{
private JFrame frame;
private JLabel label;
private ClockDisplay clock;
private boolean clockRunning = false;
private TimerThread timerThread;
public Clock() {
makeFrame();
clock = new ClockDisplay();
}
private void start() {
clockRunning = true;
timerThread = new TimerThread();
timerThread.start();
}
private void stop() {
clockRunning = false;
}
private void step() {
clock.timeTick();
label.setText(clock.getTime());
}
private void showAbout() {
JOptionPane.showMessageDialog(frame,
"Clock Version 1.0\n" +
"A simple interface for the 'Objects First' clock display project",
"About Clock",
JOptionPane.INFORMATION_MESSAGE);
}
private void quit() {
System.exit(0);
}
private void makeFrame() {
frame = new JFrame("Clock");
JPanel contentPane = (JPanel)frame.getContentPane();
contentPane.setBorder(new EmptyBorder(1, 60, 1, 60));
makeMenuBar(frame);
contentPane.setLayout(new BorderLayout(12,12));
label = new JLabel("00:00:00", SwingConstants.CENTER);
Font displayFont = label.getFont().deriveFont(96.0f);
label.setFont(displayFont);
contentPane.add(label,BorderLayout.CENTER);
JPanel toolbar = new JPanel();
toolbar.setLayout(new GridLayout(1,0));
JButton startButton = new JButton("Start");
startButton.addActionListener(e -> start());
toolbar.add(startButton);
JButton stopButton = new JButton("Stop");
stopButton.addActionListener(e -> stop());
toolbar.add(stopButton);
JButton stepButton = new JButton("Step");
stepButton.addActionListener(e -> step());
toolbar.add(stepButton);
JPanel flow = new JPanel();
flow.add(toolbar);
contentPane.add(flow, BorderLayout.SOUTH);
frame.pack();
Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
frame.setLocation(d.width/2 - frame.getWidth()/2, d.height/2 - frame.getHeight()/2);
frame.setVisible(true);
}
private void makeMenuBar(JFrame frame) {
final int SHORTCUT_MASK = Toolkit.getDefaultToolkit().getMenuShortcutKeyMask();
JMenuBar menubar = new JMenuBar();
frame.setJMenuBar(menubar);
JMenu menu;
JMenuItem item;
menu = new JMenu("File");
menubar.add(menu);
item = new JMenuItem("About Clock...");
item.addActionListener(e->showAbout());
menu.add(item);
menu.addSeparator();
item = new JMenuItem("Quit");
item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Q, SHORTCUT_MASK));
item.addActionListener(e -> quit());
menu.add(item);
}
class TimerThread extends Thread {
public void run() {
while(clockRunning) {
step();
pause();
}
}
private void pause() {
try {
Thread.sleep(1000);
} catch (InterruptedException exc) {
}
}
}
}
Class di atas merupakan class yang digunakan untuk menampilkan jam yang dibuat dalam bentuk GUI, sehingga memudahkan user untuk berinteraksi dengan aplikasi yang dibuat.
Hasil akhir:
Demikian yang saya pelajari pada minggu keempat perkuliahan pemrograman berorientasi objek.
Muhammad Zaky Zein
5025241148

Comments
Post a Comment