/**
* Class utama aplikasi yang berfungsi untuk build dan menampilkan GUI serta
* inisalisasi semua komponen class lainnya.
*
* @author Timotius Wirawan
* @version 05/12/2020
*/
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import javax.swing.*;
import java.io.File;
public class ImageViewer
{
// Field static
private static final String VERSION = "Version 1.0";
private static JFileChooser fileChooser = new JFileChooser(System.getProperty("user.dir"));
// Field
private JFrame frame;
private ImagePanel imagePanel;
private JLabel filenameLabel;
private JLabel statusLabel;
private OFImage currentImage;
//Buat ImageViewer ditampilkan di layar
public ImageViewer()
{
currentImage = null;
makeFrame();
}
//Implementasi fungsi menu
//fungsi Open: Buka pemilih file untuk memilih file gambar baru
private void openFile()
{
int returnVal = fileChooser.showOpenDialog(frame);
if (returnVal != JFileChooser.APPROVE_OPTION)
{
return; // cancelled
}
File selectedFile = fileChooser.getSelectedFile();
currentImage = ImageFileManager.loadImage(selectedFile);
if (currentImage == null) ///image file tidak valid
{
JOptionPane.showMessageDialog(frame, "The file was not in a recognized image file format.",
"Image Load Error", JOptionPane.ERROR_MESSAGE);
return;
}
imagePanel.setImage(currentImage);
showFilename(selectedFile.getPath());
showStatus("File loaded.");
frame.pack();
}
//fungsi Close: menutup foto yang ditampilkan
private void close()
{
currentImage = null;
imagePanel.clearImage();
showFilename(null);
}
//fungsi Quit: keluar dari aplikasi
private void quit()
{
System.exit(0);
}
//fungsi \'Darker\': membuat gambar lebih hitam
private void makeDarker()
{
if (currentImage != null)
{
currentImage.darker();
frame.repaint();
showStatus("Applied: darker");
}
else
{
showStatus("No image loaded.");
}
}
//fungsi \'lighter\': membuat gambar lebih terang
private void makeLighter()
{
if (currentImage != null)
{
currentImage.lighter();
frame.repaint();
showStatus("Applied: lighter");
}
else
{
showStatus("No image loaded.");
}
}
//fungsi \'threshold\': menerapkan filter threshold
private void threshold()
{
if (currentImage != null)
{
currentImage.threshold();
frame.repaint();
showStatus("Applied: threshold");
}
else
{
showStatus("No image loaded.");
}
}
//fungsi \'lighter\': membuat gambar lebih terang
private void showAbout()
{
JOptionPane.showMessageDialog(frame, "ImageViewer\\n" + VERSION,
"About ImageViewer", JOptionPane.INFORMATION_MESSAGE);
}
//Support methods
/**
* tampilkan nama file pada label yang sesuai.
*
* @param filename nama file yang akan ditampilkan
*/
private void showFilename(String filename)
{
if (filename == null)
{
filenameLabel.setText("No file displayed.");
}
else
{
filenameLabel.setText("File: " + filename);
}
}
/**
* Membuat frame swing beserta isinya
*
* @param text pesan status yang akan ditampilkan
*/
private void showStatus(String text)
{
statusLabel.setText(text);
}
//Swing stuff untuk membangun frame dan semua komponen lainnya
//Membuat frame swing dan semua komponennya
private void makeFrame()
{
frame = new JFrame("ImageViewer");
makeMenuBar(frame);
Container contentPane = frame.getContentPane();
// Pengaturan layout
contentPane.setLayout(new BorderLayout(6, 6));
filenameLabel = new JLabel();
contentPane.add(filenameLabel, BorderLayout.NORTH);
imagePanel = new ImagePanel();
contentPane.add(imagePanel, BorderLayout.CENTER);
statusLabel = new JLabel(VERSION);
contentPane.add(statusLabel, BorderLayout.SOUTH);
// Mengatur dan menampilkan konten
showFilename(null);
frame.pack();
Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
frame.setLocation(d.width / 2 - frame.getWidth() / 2, d.height / 2 - frame.getHeight() / 2);
frame.setVisible(true);
}
/**
* Membuat main frame\'s menu bar.
*
* @param frame Frame menu harus ditambahkan
*/
private void makeMenuBar(JFrame frame)
{
final int SHORTCUT_MASK = Toolkit.getDefaultToolkit().getMenuShortcutKeyMask();
JMenuBar menubar = new JMenuBar();
frame.setJMenuBar(menubar);
JMenu menu;
JMenuItem item;
// Membuat menu File
menu = new JMenu("File");
menubar.add(menu);
item = new JMenuItem("Open");
item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O, SHORTCUT_MASK));
item.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
openFile();
}
});
menu.add(item);
item = new JMenuItem("Close");
item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_W, SHORTCUT_MASK));
item.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
close();
}
});
menu.add(item);
menu.addSeparator();
item = new JMenuItem("Quit");
item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Q, SHORTCUT_MASK));
item.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
quit();
}
});
menu.add(item);
// Membuat menu Filter
menu = new JMenu("Filter");
menubar.add(menu);
item = new JMenuItem("Darker");
item.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
makeDarker();
}
});
menu.add(item);
item = new JMenuItem("Lighter");
item.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
makeLighter();
}
});
menu.add(item);
item = new JMenuItem("Threshold");
item.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
threshold();
}
});
menu.add(item);
// Membuat menu Help
menu = new JMenu("Help");
menubar.add(menu);
item = new JMenuItem("About ImageViewer");
item.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
showAbout();
}
});
menu.add(item);
}
}