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));
}
}