/**
* ImageViewer adalah main class dari aplikasi image viewer. ini membangun dan
* menampilkan aplikasi GUI dan inisialisasi semua komponen lainnya.
* untuk memulai aplikasi ini, buat sebuah objek dari class ini
*
* @author Muhammad Bagus Istighfar
* @version 10 Desember 2020
*/
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.io.File;
public class ImageViewer
{
// static fields:
private static final String VERSION = "Version 1.0";
private static JFileChooser fileChooser = new JFileChooser(System.getProperty("user.dir"));
// fields:
private JFrame frame;
private JLabel filenameLabel;
private ImagePanel imagePanel;
private JLabel statusLabel;
private OFImage currentImage;
/**
* membuat ImageViewer yang ditampilkan dilayar
*/
public ImageViewer(){
currentImage = null;
makeFrame();
}
// ------- implementasi fungsi menu --------
/**
* fungsi Open : membuka file chooser untuk memilih file gambar baru
*/
private void openFile()
{
int returnVal = fileChooser.showOpenDialog(frame);
if(returnVal != JFileChooser.APPROVE_OPTION){
return; // dibatalkan
}
File selectedFile = fileChooser.getSelectedFile();
currentImage = ImageFileManager.loadImage(selectedFile);
if(currentImage == null) // jika filenya invalid
{
JOptionPane.showMessageDialog(frame,
"File gambar ini tidak dikenal",
"Image Load Error",
JOptionPane.ERROR_MESSAGE);
return;
}
imagePanel.setImage(currentImage);
showFilename(selectedFile.getPath());
showStatus("File Loaded.");
frame.pack();
}
/**
* fungsi close : menutup gambar sekarang
*/
private void close(){
currentImage = null;
imagePanel.clearImage();
showFilename(null);
}
/**
* fungsi Quit : untuk keluar aplikasi
*/
private void quit(){
System.exit(0);
}
/**
* fungsi darker : untuk membuat gambar lebih gelap
*/
private void makeDarker(){
if(currentImage !=null){
currentImage.darker();
frame.repaint();
showStatus("Applied : Darker");
}else{
showStatus("Tidak ada gambar yang dimasukkan");
}
}
/**
* fungsi Lighter : untuk membuat gambar lebih terang dari masa depanmu
*/
private void makeLighter(){
if(currentImage !=null){
currentImage.lighter();
frame.repaint();
showStatus("Applied : Lighter");
}else{
showStatus("Tidak ada gambar yang dimasukkan");
}
}
/**
* fungsi threshold : memakai filter threshold
*/
private void threshold(){
if(currentImage !=null){
currentImage.threshold();
frame.repaint();
showStatus("Applied : Threshold");
}else{
showStatus("Tidak ada gambar yang dimasukkan");
}
}
/**
* fungsi About : menunjukan informasi tentang aplikasi ini
*/
private void showAbout(){
JOptionPane.showMessageDialog(frame,
"Image Viewer\\n" + VERSION,
"About Image Viewer",
JOptionPane.INFORMATION_MESSAGE);
}
// ----- Support Methods -----
/**
* Menunjukkan nama file pada tabel yang sesuai
* @param filename nama file yang akan ditampilkan
*/
private void showFilename(String filename){
if(filename == null){
filenameLabel.setText("Tidak ada file yang ditampilkan");
}
else {
filenameLabel.setText("File: " + filename);
}
}
/**
* menampilkan pesan status pada frame status bar
* @param text pesan status yang akan ditampilkan
*/
private void showStatus(String text){
statusLabel.setText(text);
}
/**
* membuat Swing Frame dan kontennya
*/
private void makeFrame()
{
frame = new JFrame("Image Viewer");
makeMenuBar(frame);
Container contentPane = frame.getContentPane();
//tentukan pengelola tata letak dengan jarak yang bagus
contentPane.setLayout(new BorderLayout(10,10));
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);
//Sudah selesai di-Build -- Atur komponen dan penampilan
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);
}
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() {
@Override
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() {
@Override
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() {
@Override
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() {
@Override
public void actionPerformed(ActionEvent e) {
makeDarker();
}
});
menu.add(item);
item = new JMenuItem("Lighter");
item.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
makeLighter();
}
});
menu.add(item);
item = new JMenuItem("Threshold");
item.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
threshold();
}
});
menu.add(item);
// membuat menu Help
menu = new JMenu("Help");
menubar.add(menu);
item = new JMenuItem("Tentang Image Viewer...");
item.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
showAbout();
}
});
menu.add(item);
}
}