diff options
| author | Benjamin Culkin <bjculkin@mix.wvu.edu> | 2018-04-25 12:52:52 -0700 |
|---|---|---|
| committer | Benjamin Culkin <bjculkin@mix.wvu.edu> | 2018-04-25 12:52:59 -0700 |
| commit | 697bc0bae293a9f31c00f6e10f33955151228f64 (patch) | |
| tree | 500b7c9b881972e1d7b78017c39659e060701877 /src/bjc | |
Initial commit
Diffstat (limited to 'src/bjc')
| -rw-r--r-- | src/bjc/imgchain/ImgChain.java | 126 | ||||
| -rw-r--r-- | src/bjc/imgchain/ImgViewer.java | 200 | ||||
| -rw-r--r-- | src/bjc/imgchain/utils/SimpleInputPanel.java | 45 |
3 files changed, 371 insertions, 0 deletions
diff --git a/src/bjc/imgchain/ImgChain.java b/src/bjc/imgchain/ImgChain.java new file mode 100644 index 0000000..f90ae78 --- /dev/null +++ b/src/bjc/imgchain/ImgChain.java @@ -0,0 +1,126 @@ +package bjc.imgchain; + +import java.awt.GridLayout; +import java.awt.Image; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.io.File; +import java.util.HashMap; +import java.util.Map; + +import javax.swing.JDesktopPane; +import javax.swing.JFileChooser; +import javax.swing.JFrame; +import javax.swing.JMenu; +import javax.swing.JMenuBar; +import javax.swing.JMenuItem; +import javax.swing.JOptionPane; + +public class ImgChain { + private final class LoadImageListener implements ActionListener { + @Override + public void actionPerformed(ActionEvent ev) { + JFileChooser jfc = new JFileChooser(); + jfc.setMultiSelectionEnabled(true); + + int res = jfc.showOpenDialog(desktop); + + if (res != JFileChooser.APPROVE_OPTION) { + return; + } + + for (File fle : jfc.getSelectedFiles()) { + ImgViewer view = new ImgViewer(ImgChain.this, fle); + + if (view.isInitialized()) { + desktop.add(view); + view.setVisible(true); + } + } + } + } + + private JDesktopPane desktop; + + private Map<String, Image> imageRepo; + + public static void main(String[] args) { + System.out.println("ImgChain Loading..."); + + ImgChain chn = new ImgChain(); + + chn.setupGUI(); + } + + public ImgChain() { + imageRepo = new HashMap<>(); + } + + private void setupGUI() { + JFrame frame = new JFrame("ImgChain v1"); + frame.setLayout(new GridLayout(1, 1)); + + desktop = new JDesktopPane(); + + JMenuBar menu = setupMenubar(frame); + + frame.setJMenuBar(menu); + + frame.add(desktop); + + frame.setSize(640, 480); + + frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); + + frame.setVisible(true); + } + + private JMenuBar setupMenubar(JFrame frame) { + JMenuBar menu = new JMenuBar(); + + JMenu fileMenu = new JMenu("File"); + fileMenu.setMnemonic('F'); + + JMenuItem aboutItem = new JMenuItem("About"); + aboutItem.setMnemonic('A'); + aboutItem.addActionListener((ev) -> { + JOptionPane.showMessageDialog(frame, "ImgChain v1\nDeveloped by Benjamin Culkin", + "About ImgChain", JOptionPane.INFORMATION_MESSAGE); + }); + + JMenuItem closeItem = new JMenuItem("Close"); + closeItem.setMnemonic('C'); + closeItem.addActionListener((ev) -> { + frame.dispose(); + }); + + fileMenu.add(aboutItem); + fileMenu.addSeparator(); + fileMenu.add(closeItem); + + JMenu imageMenu = new JMenu("Images"); + imageMenu.setMnemonic('I'); + + JMenuItem loadImage = new JMenuItem("Load Images..."); + loadImage.setMnemonic('L'); + loadImage.addActionListener(new LoadImageListener()); + + imageMenu.add(loadImage); + + menu.add(fileMenu); + menu.add(imageMenu); + return menu; + } + + public void addImage(String name, Image img) { + if (imageRepo.containsKey(name)) { + String msg = String.format("Are you sure you want to overwrite stored image '%s'?", name); + + if (JOptionPane.showInternalConfirmDialog(desktop, msg) != JOptionPane.OK_OPTION) { + return; + } + } + + imageRepo.put(name, img); + } +} diff --git a/src/bjc/imgchain/ImgViewer.java b/src/bjc/imgchain/ImgViewer.java new file mode 100644 index 0000000..39586a8 --- /dev/null +++ b/src/bjc/imgchain/ImgViewer.java @@ -0,0 +1,200 @@ +package bjc.imgchain; + +import java.awt.GridLayout; +import java.awt.Image; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.io.File; +import java.io.IOException; +import java.net.MalformedURLException; +import java.net.URL; + +import javax.imageio.ImageIO; +import javax.swing.*; + +import bjc.imgchain.utils.SimpleInputPanel; + +public class ImgViewer extends JInternalFrame { + private final class ScaleImageListener implements ActionListener { + @Override + public void actionPerformed(ActionEvent ev) { + int height = Integer.parseInt(JOptionPane.showInputDialog("Enter new image height")); + int width = Integer.parseInt(JOptionPane.showInputDialog("Enter new image width")); + + icon.setImage(icon.getImage().getScaledInstance(width, height, Image.SCALE_DEFAULT)); + + repaint(); + } + } + + private final class ReloadImageListener implements ActionListener { + private final File img; + + private ReloadImageListener(File img) { + this.img = img; + } + + @Override + public void actionPerformed(ActionEvent ev) { + try { + icon.setImage(ImageIO.read(img)); + } catch (IOException e) { + String msg = String.format("Error: Could not load image %s", img.getPath()); + + System.out.printf("%s\n", msg); + + e.printStackTrace(); + + JOptionPane.showInternalMessageDialog(ImgViewer.this, msg, "Error loading image", + JOptionPane.ERROR_MESSAGE); + } + } + } + + private final class ChangeImageListener implements ActionListener { + @Override + public void actionPerformed(ActionEvent ev) { + JFileChooser jfc = new JFileChooser(); + jfc.setMultiSelectionEnabled(false); + + int res = jfc.showOpenDialog(ImgViewer.this); + + if (res != JFileChooser.APPROVE_OPTION) { + return; + } + + try { + File tmp = jfc.getSelectedFile(); + + icon.setImage(ImageIO.read(tmp)); + + img = tmp; + } catch (IOException e) { + String msg = String.format("Error: Could not load image %s", img.getPath()); + + System.out.printf("%s\n", msg); + + e.printStackTrace(); + + JOptionPane.showInternalMessageDialog(null, msg, "Error loading image", + JOptionPane.ERROR_MESSAGE); + } + } + } + + private static final long serialVersionUID = -4727584150861526435L; + + private File img; + + private boolean initted; + + private ImageIcon icon; + + private ImgChain desktop; + + public ImgViewer(ImgChain desk, File img) { + super("Image Viewer - " + img.getName(), true, true, true, true); + initted = false; + + this.img = img; + this.desktop = desk; + + initted = setupGUI(img); + } + + private boolean setupGUI(File img) { + setSize(320, 240); + setLayout(new GridLayout(1, 1)); + + JMenuBar bar = setupMenubar(img); + + setJMenuBar(bar); + + JLabel lab = loadLabel(img); + if (lab == null) { + return false; + } + + add(lab); + + return true; + } + + private JMenuBar setupMenubar(File img) { + JMenuBar bar = new JMenuBar(); + + JMenu fileMenu = new JMenu("File"); + fileMenu.setMnemonic('F'); + + JMenuItem changeImage = new JMenuItem("Change Image"); + changeImage.setMnemonic('C'); + changeImage.addActionListener(new ChangeImageListener()); + + JMenuItem reloadImage = new JMenuItem("Reload Image"); + reloadImage.setMnemonic('R'); + reloadImage.addActionListener(new ReloadImageListener(img)); + + JMenuItem storeImage = new JMenuItem("Store Image"); + storeImage.setMnemonic('S'); + storeImage.addActionListener((ev) -> { + String inp = JOptionPane.showInternalInputDialog(this, "Enter name to store image under"); + + if(inp == null) return; + + inp = inp.trim(); + + if(inp.equals("")) { + return; + } + + desktop.addImage(inp, icon.getImage()); + }); + + fileMenu.add(changeImage); + fileMenu.add(reloadImage); + fileMenu.addSeparator(); + fileMenu.add(storeImage); + + JMenu editMenu = new JMenu("Edit Image"); + editMenu.setMnemonic('E'); + + JMenuItem scaleImage = new JMenuItem("Scale Image"); + scaleImage.setMnemonic('S'); + scaleImage.addActionListener(new ScaleImageListener()); + + editMenu.add(scaleImage); + + bar.add(fileMenu); + bar.add(editMenu); + return bar; + } + + private JLabel loadLabel(File img) { + JLabel lab = null; + + try { + URL imgURL = img.toURI().toURL(); + + icon = new ImageIcon(imgURL); + + setSize(icon.getIconWidth(), icon.getIconHeight()); + + lab = new JLabel(icon); + } catch (MalformedURLException e) { + String msg = String.format("Error: Could not load image %s", img.getPath()); + + System.out.printf("%s\n", msg); + + e.printStackTrace(); + + JOptionPane.showInternalMessageDialog(this, msg, "Error loading image", + JOptionPane.ERROR_MESSAGE); + } + + return lab; + } + + public boolean isInitialized() { + return initted; + } +} diff --git a/src/bjc/imgchain/utils/SimpleInputPanel.java b/src/bjc/imgchain/utils/SimpleInputPanel.java new file mode 100644 index 0000000..413786a --- /dev/null +++ b/src/bjc/imgchain/utils/SimpleInputPanel.java @@ -0,0 +1,45 @@ +package bjc.imgchain.utils; + +import java.awt.BorderLayout; + +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JTextField; + +/** + * A simple component for text input + * + * @author ben + * + */ +public class SimpleInputPanel extends JPanel { + private static final long serialVersionUID = -4734279623645236868L; + + /** + * The text field containing the input value + */ + public final JTextField inputValue; + + /** + * Create a new input panel + * + * @param label + * The label for the field + * @param columns + * The number of columns of text input to take + */ + public SimpleInputPanel(final String label, final int columns) { + setLayout(new BorderLayout()); + + final JLabel inputLabel = new JLabel(label); + + if (columns < 1) { + inputValue = new JTextField(); + } else { + inputValue = new JTextField(columns); + } + + add(inputLabel, BorderLayout.LINE_START); + add(inputValue, BorderLayout.CENTER); + } +} |
