Pemrograman GUI dengan Membuat Image Viewer dan Login Frame
Raden Kurniawan Agung Fitrianto | 5025241104 | PBO A2 | Pertemuan 14
1. Membuat frame windows user login dan password.
LoginFrame Class
Program ini dijalankan dengam menggunakan satu kelas yakni LoginFrame Class. Cara kerjanya adalah dengan membuat jendela login berbasis Swing dengan tata letak GridBagLayout dari AWT. Pada metode main, tampilan sistem diaktifkan melalui UIManager.setLookAndFeel, kemudian UI dijalankan di thread Event Dispatch Thread menggunakan SwingUtilities.invokeLater. createAndShowGUI membuat JFrame berukuran 350 × 200 piksel, menempatkannya di tengah layar, dan menambahkan JPanel yang memakai GridBagLayout. Komponen‑komponen yang ditambahkan meliputi JLabel untuk label “Username” dan “Password”, JTextField untuk input nama pengguna, serta JPasswordField untuk kata sandi. Dua tombol, “Login” dan “Cancel”, diletakkan dalam panel terpisah dengan FlowLayout berorientasi kanan. Listener pada tombol “Login” mengambil teks dari kedua field, memeriksa apakah kosong, dan menampilkan dialog error bila diperlukan; bila valid, dialog selamat datang muncul. Listener pada tombol “Cancel” menutup jendela dengan memanggil frame.dispose(). Semua komponen di‑grid‑kan menggunakan GridBagConstraints yang mengatur posisi (gridx, gridy), lebar kolom (gridwidth), serta margin (insets). Akhirnya, panel utama ditambahkan ke frame dan jendela ditampilkan dengan setVisible(true).
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class LoginFrame {
public static void main(String[] args) {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception ignored) {}
SwingUtilities.invokeLater(LoginFrame::createAndShowGUI);
}
private static void createAndShowGUI() {
JFrame frame = new JFrame("Login");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(350, 200);
frame.setLocationRelativeTo(null);
JPanel panel = new JPanel(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.insets = new Insets(8, 8, 8, 8);
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.gridx = 0;
gbc.gridy = 0;
panel.add(new JLabel("Username:"), gbc);
gbc.gridx = 1;
JTextField userField = new JTextField(15);
panel.add(userField, gbc);
gbc.gridx = 0;
gbc.gridy = 1;
panel.add(new JLabel("Password:"), gbc);
gbc.gridx = 1;
JPasswordField passField = new JPasswordField(15);
panel.add(passField, gbc);
JPanel btnPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT, 0, 0));
JButton loginBtn = new JButton("Login");
JButton cancelBtn = new JButton("Cancel");
btnPanel.add(loginBtn);
btnPanel.add(Box.createHorizontalStrut(10));
btnPanel.add(cancelBtn);
gbc.gridx = 0;
gbc.gridy = 2;
gbc.gridwidth = 2;
panel.add(btnPanel, gbc);
loginBtn.addActionListener(e -> {
String user = userField.getText().trim();
String pass = new String(passField.getPassword());
if (user.isEmpty() || pass.isEmpty()) {
JOptionPane.showMessageDialog(frame,
"Please enter both username and password.",
"Input Error",
JOptionPane.ERROR_MESSAGE);
} else {
JOptionPane.showMessageDialog(frame,
"Welcome, " + user + "!",
"Login Successful",
JOptionPane.INFORMATION_MESSAGE);
}
});
cancelBtn.addActionListener(e -> frame.dispose());
frame.add(panel);
frame.setVisible(true);
}
}
| Output Program |
2. Implementasikan aplikasi image viewer.
OFImage Class
Kelas ini berfungsi untuk mendefinisikan gambar ke dalam bentuk objek.
import java.awt.*;
import java.awt.image.*;
import javax.swing.*;
public class OFImage extends BufferedImage
{
public OFImage(BufferedImage image)
{
super(image.getColorModel(), image.copyData(null),
image.isAlphaPremultiplied(), null);
}
public OFImage(int width, int height)
{
super(width, height, TYPE_INT_RGB);
}
public void setPixel(int x, int y, Color col)
{
int pixel = col.getRGB();
setRGB(x, y, pixel);
}
public Color getPixel(int x, int y)
{
int pixel = getRGB(x, y);
return new Color(pixel);
}
}
ImageFileManager Class
Kelas ini adalah kelas utilitas yang berguna untuk melakukan save dan load pada gambar.
import java.awt.image.*;
import javax.imageio.*;
import java.io.*;
public class ImageFileManager
{
private static final String IMAGE_FORMAT = "jpg";
public static OFImage loadImage(File imageFile)
{
try {
BufferedImage image = ImageIO.read(imageFile);
if(image == null || (image.getWidth(null) < 0)) {
return null;
}
return new OFImage(image);
}
catch(IOException exc) {
return null;
}
}
public static void saveImage(OFImage image, File file)
{
try {
ImageIO.write(image, IMAGE_FORMAT, file);
}
catch(IOException exc) {
return;
}
}
}
ImagePanel Class
Kelas ImagePanel adalah komponen Swing yang dapat menampilkan OFImage. Komponen ini dibangun sebagai subkelas dari JComponent dengan fungsi tambahan untuk mengatur OFImage yang akan ditampilkan di permukaan komponen ini.
import java.awt.*;
import javax.swing.*;
import java.awt.image.*;
public class ImagePanel extends JComponent
{
private int width, height;
private OFImage panelImage;
public ImagePanel()
{
width = 360;
height = 240;
panelImage = null;
}
public void setImage(OFImage image)
{
if(image != null) {
width = image.getWidth();
height = image.getHeight();
panelImage = image;
repaint();
}
}
public void clearImage()
{
Graphics imageGraphics = panelImage.getGraphics();
imageGraphics.setColor(Color.LIGHT_GRAY);
imageGraphics.fillRect(0, 0, width, height);
repaint();
}
public Dimension getPreferredSize()
{
return new Dimension(width, height);
}
public void paintComponent(Graphics g)
{
Dimension size = getSize();
g.clearRect(0, 0, size.width, size.height);
if(panelImage != null) {
g.drawImage(panelImage, 0, 0, null);
}
}
}
ImageViewer Class
ImageViewer adalah kelas utama aplikasi penampil gambar. Kelas ini membangun dan menampilkan GUI aplikasi dan menginisialisasi semua komponen lainnya.
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import javax.swing.*;
import javax.swing.border.*;
import java.io.File;
import java.util.List;
import java.util.ArrayList;
import java.util.Iterator;
public class ImageViewer
{
private static JFileChooser fileChooser = new JFileChooser(System.getProperty("user.dir"));
private JFrame frame;
private ImagePanel imagePanel;
private JLabel filenameLabel;
private JLabel statusLabel;
private JButton smallerButton;
private JButton largerButton;
private OFImage currentImage;
public ImageViewer()
{
currentImage = null;
makeFrame();
}
private void openFile()
{
int returnVal = fileChooser.showOpenDialog(frame);
if(returnVal != JFileChooser.APPROVE_OPTION) {
return;
}
File selectedFile = fileChooser.getSelectedFile();
currentImage = ImageFileManager.loadImage(selectedFile);
if(currentImage == null) {
JOptionPane.showMessageDialog(frame,
"The file was not in a recognized image file format.",
"Image Load Error",
JOptionPane.ERROR_MESSAGE);
return;
}
imagePanel.setImage(currentImage);
setButtonsEnabled(true);
showFilename(selectedFile.getPath());
showStatus("File loaded.");
frame.pack();
}
private void close()
{
currentImage = null;
imagePanel.clearImage();
showFilename(null);
setButtonsEnabled(false);
}
private void saveAs()
{
if(currentImage != null) {
int returnVal = fileChooser.showSaveDialog(frame);
if(returnVal != JFileChooser.APPROVE_OPTION) {
return;
}
File selectedFile = fileChooser.getSelectedFile();
ImageFileManager.saveImage(currentImage, selectedFile);
showFilename(selectedFile.getPath());
}
}
private void quit()
{
System.exit(0);
}
private void makeLarger()
{
if(currentImage != null) {
int width = currentImage.getWidth();
int height = currentImage.getHeight();
OFImage newImage = new OFImage(width * 2, height * 2);
for(int y = 0; y < height; y++) {
for(int x = 0; x < width; x++) {
Color col = currentImage.getPixel(x, y);
newImage.setPixel(x * 2, y * 2, col);
newImage.setPixel(x * 2 + 1, y * 2, col);
newImage.setPixel(x * 2, y * 2 + 1, col);
newImage.setPixel(x * 2+1, y * 2 + 1, col);
}
}
currentImage = newImage;
imagePanel.setImage(currentImage);
frame.pack();
}
}
private void makeSmaller()
{
if(currentImage != null) {
int width = currentImage.getWidth() / 2;
int height = currentImage.getHeight() / 2;
OFImage newImage = new OFImage(width, height);
for(int y = 0; y < height; y++) {
for(int x = 0; x < width; x++) {
newImage.setPixel(x, y, currentImage.getPixel(x * 2, y * 2));
}
}
currentImage = newImage;
imagePanel.setImage(currentImage);
frame.pack();
}
}
private void showFilename(String filename)
{
if(filename == null) {
filenameLabel.setText("No file displayed.");
}
else {
filenameLabel.setText("File: " + filename);
}
}
private void showStatus(String text)
{
statusLabel.setText(text);
}
private void setButtonsEnabled(boolean status)
{
smallerButton.setEnabled(status);
largerButton.setEnabled(status);
}
private void makeFrame()
{
frame = new JFrame("ImageViewer");
JPanel contentPane = (JPanel)frame.getContentPane();
contentPane.setBorder(new EmptyBorder(12, 12, 12, 12));
makeMenuBar(frame);
contentPane.setLayout(new BorderLayout(6, 6));
imagePanel = new ImagePanel();
imagePanel.setBorder(new EtchedBorder());
contentPane.add(imagePanel, BorderLayout.CENTER);
filenameLabel = new JLabel();
contentPane.add(filenameLabel, BorderLayout.NORTH);
JPanel toolbar = new JPanel();
toolbar.setLayout(new GridLayout(0, 1));
smallerButton = new JButton("Smaller");
smallerButton.addActionListener(e -> makeSmaller());
toolbar.add(smallerButton);
largerButton = new JButton("Larger");
largerButton.addActionListener(e -> makeLarger());
toolbar.add(largerButton);
JPanel flow = new JPanel();
flow.add(toolbar);
contentPane.add(flow, BorderLayout.WEST);
showFilename(null);
setButtonsEnabled(false);
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("Open...");
item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O, SHORTCUT_MASK));
item.addActionListener(e -> openFile());
menu.add(item);
item = new JMenuItem("Close");
item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_W, SHORTCUT_MASK));
item.addActionListener(e -> close());
menu.add(item);
menu.addSeparator();
item = new JMenuItem("Save As...");
item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, SHORTCUT_MASK));
item.addActionListener(e -> saveAs());
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);
menubar.add(menu);
}
public static void main(String[] args) {
new ImageViewer();
}
}
| Output Program |
Comments
Post a Comment