first commit
This commit is contained in:
@@ -0,0 +1,11 @@
|
||||
#BlueJ class context
|
||||
comment0.params=
|
||||
comment0.target=OFImage\ getImage()
|
||||
comment0.text=\n\ Open\ a\ file\ chooser\ and\ let\ the\ user\ select\ an\ image\ file\ in\ the\ file\n\ system.\ Then\ read\ an\ image\ file\ from\ disk\ and\ return\ it\ as\ an\ image.\ This\ method\n\ can\ read\ JPG\ and\ PNG\ file\ formats.\ In\ case\ of\ any\ problem\ (e.g\ the\ file\ does\n\ not\ exist,\ is\ in\ an\ undecodable\ format,\ or\ any\ other\ read\ error)\ this\ method\n\ returns\ null.\n\ \n\ @return\ \ \ \ \ \ \ The\ image\ object\ or\ null\ is\ it\ was\ not\ a\ valid\ image\ file.\n
|
||||
comment1.params=imageFile
|
||||
comment1.target=OFImage\ loadImage(java.io.File)
|
||||
comment1.text=\n\ Read\ an\ image\ file\ from\ disk\ and\ return\ it\ as\ a\ BufferedImage.\ This\ method\n\ can\ read\ JPG\ and\ PNG\ file\ formats.\ In\ case\ of\ any\ problem\ (e.g\ the\ file\ does\n\ not\ exist,\ is\ in\ an\ undecodable\ format,\ or\ any\ other\ read\ error)\ this\ method\n\ returns\ null.\n\ \n\ @param\ imageFile\ \ The\ image\ file\ to\ be\ loaded.\n\ @return\ \ \ \ \ \ \ \ \ \ \ The\ image\ object\ or\ null\ if\ it\ was\ not\ a\ valid\ image\ file.\n
|
||||
comment2.params=image\ file
|
||||
comment2.target=void\ saveImage(OFImage,\ java.io.File)
|
||||
comment2.text=\n\ Write\ an\ image\ file\ to\ disk.\ The\ file\ format\ is\ JPG.\ In\ case\ of\ any\ problem\n\ the\ method\ just\ silently\ returns.\n\ \n\ @param\ image\ \ The\ image\ to\ be\ saved.\n\ @param\ file\ \ \ The\ file\ to\ save\ to.\n
|
||||
numComments=3
|
@@ -0,0 +1,83 @@
|
||||
import java.awt.image.*;
|
||||
import javax.imageio.*;
|
||||
import javax.swing.*;
|
||||
import java.io.*;
|
||||
|
||||
/**
|
||||
* ImageFileManager is a small utility class with static methods to load
|
||||
* and save images.
|
||||
*
|
||||
* The files on disk can be in JPG or PNG image format. For files written
|
||||
* by this class, the format is determined by the constant IMAGE_FORMAT.
|
||||
*
|
||||
* @author Michael Kölling and David J. Barnes.
|
||||
* @version 1.0
|
||||
*/
|
||||
public class ImageFileManager
|
||||
{
|
||||
// A constant for the image format that this writer uses for writing.
|
||||
// Available formats are "jpg" and "png".
|
||||
private static final String IMAGE_FORMAT = "jpg";
|
||||
private static JFileChooser fileChooser = new JFileChooser(System.getProperty("user.dir"));
|
||||
|
||||
/**
|
||||
* Open a file chooser and let the user select an image file in the file
|
||||
* system. Then read an image file from disk and return it as an image. This method
|
||||
* can read JPG and PNG file formats. In case of any problem (e.g the file does
|
||||
* not exist, is in an undecodable format, or any other read error) this method
|
||||
* returns null.
|
||||
*
|
||||
* @return The image object or null is it was not a valid image file.
|
||||
*/
|
||||
public static OFImage getImage()
|
||||
{
|
||||
int returnVal = fileChooser.showOpenDialog(null);
|
||||
|
||||
if(returnVal != JFileChooser.APPROVE_OPTION) {
|
||||
return null; // cancelled
|
||||
}
|
||||
File selectedFile = fileChooser.getSelectedFile();
|
||||
return loadImage(selectedFile);
|
||||
}
|
||||
|
||||
/**
|
||||
* Read an image file from disk and return it as a BufferedImage. This method
|
||||
* can read JPG and PNG file formats. In case of any problem (e.g the file does
|
||||
* not exist, is in an undecodable format, or any other read error) this method
|
||||
* returns null.
|
||||
*
|
||||
* @param imageFile The image file to be loaded.
|
||||
* @return The image object or null if it was not a valid image file.
|
||||
*/
|
||||
public static OFImage loadImage(File imageFile)
|
||||
{
|
||||
try {
|
||||
BufferedImage image = ImageIO.read(imageFile);
|
||||
if(image == null || (image.getWidth(null) < 0)) {
|
||||
// we could not load the image - probably invalid file format
|
||||
return null;
|
||||
}
|
||||
return new OFImage(image);
|
||||
}
|
||||
catch(IOException exc) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Write an image file to disk. The file format is JPG. In case of any problem
|
||||
* the method just silently returns.
|
||||
*
|
||||
* @param image The image to be saved.
|
||||
* @param file The file to save to.
|
||||
*/
|
||||
public static void saveImage(OFImage image, File file)
|
||||
{
|
||||
try {
|
||||
ImageIO.write(image, IMAGE_FORMAT, file);
|
||||
}
|
||||
catch(IOException exc) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,17 @@
|
||||
#BlueJ class context
|
||||
comment0.params=
|
||||
comment0.target=ImagePanel()
|
||||
comment0.text=\n\ Create\ a\ new,\ empty\ ImagePanel.\n
|
||||
comment1.params=image
|
||||
comment1.target=void\ setImage(OFImage)
|
||||
comment1.text=\n\ Set\ the\ image\ that\ this\ panel\ should\ show.\n\ \n\ @param\ image\ \ The\ image\ to\ be\ displayed.\n
|
||||
comment2.params=
|
||||
comment2.target=void\ clearImage()
|
||||
comment2.text=\n\ Clear\ the\ image\ on\ this\ panel.\n
|
||||
comment3.params=
|
||||
comment3.target=java.awt.Dimension\ getPreferredSize()
|
||||
comment3.text=\n\ Tell\ the\ layout\ manager\ how\ big\ we\ would\ like\ to\ be.\n\ (This\ method\ gets\ called\ by\ layout\ managers\ for\ placing\n\ the\ components.)\n\ \n\ @return\ The\ preferred\ dimension\ for\ this\ component.\n
|
||||
comment4.params=g
|
||||
comment4.target=void\ paintComponent(java.awt.Graphics)
|
||||
comment4.text=\n\ This\ component\ needs\ to\ be\ redisplayed.\ Copy\ the\ internal\ image\ \n\ to\ screen.\ (This\ method\ gets\ called\ by\ the\ Swing\ screen\ painter\ \n\ every\ time\ it\ want\ this\ component\ displayed.)\n\ \n\ @param\ g\ The\ graphics\ context\ that\ can\ be\ used\ to\ draw\ on\ this\ component.\n
|
||||
numComments=5
|
@@ -0,0 +1,89 @@
|
||||
import java.awt.*;
|
||||
import javax.swing.*;
|
||||
import java.awt.image.*;
|
||||
|
||||
/**
|
||||
* An ImagePanel is a Swing component that can display an OFImage.
|
||||
* It is constructed as a subclass of JComponent with the added functionality
|
||||
* of setting an OFImage that will be displayed on the surface of this
|
||||
* component.
|
||||
*
|
||||
* @author Michael Kölling and David J. Barnes.
|
||||
* @version 1.0
|
||||
*/
|
||||
public class ImagePanel extends JComponent
|
||||
{
|
||||
// The current width and height of this panel
|
||||
private int width, height;
|
||||
|
||||
// An internal image buffer that is used for painting. For
|
||||
// actual display, this image buffer is then copied to screen.
|
||||
private OFImage panelImage;
|
||||
|
||||
/**
|
||||
* Create a new, empty ImagePanel.
|
||||
*/
|
||||
public ImagePanel()
|
||||
{
|
||||
width = 360; // arbitrary size for empty panel
|
||||
height = 240;
|
||||
panelImage = null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the image that this panel should show.
|
||||
*
|
||||
* @param image The image to be displayed.
|
||||
*/
|
||||
public void setImage(OFImage image)
|
||||
{
|
||||
if(image != null) {
|
||||
width = image.getWidth();
|
||||
height = image.getHeight();
|
||||
panelImage = image;
|
||||
repaint();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Clear the image on this panel.
|
||||
*/
|
||||
public void clearImage()
|
||||
{
|
||||
Graphics imageGraphics = panelImage.getGraphics();
|
||||
imageGraphics.setColor(Color.LIGHT_GRAY);
|
||||
imageGraphics.fillRect(0, 0, width, height);
|
||||
repaint();
|
||||
}
|
||||
|
||||
// The following methods are redefinitions of methods
|
||||
// inherited from superclasses.
|
||||
|
||||
/**
|
||||
* Tell the layout manager how big we would like to be.
|
||||
* (This method gets called by layout managers for placing
|
||||
* the components.)
|
||||
*
|
||||
* @return The preferred dimension for this component.
|
||||
*/
|
||||
public Dimension getPreferredSize()
|
||||
{
|
||||
return new Dimension(width, height);
|
||||
}
|
||||
|
||||
/**
|
||||
* This component needs to be redisplayed. Copy the internal image
|
||||
* to screen. (This method gets called by the Swing screen painter
|
||||
* every time it want this component displayed.)
|
||||
*
|
||||
* @param g The graphics context that can be used to draw on this component.
|
||||
*/
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,17 @@
|
||||
#BlueJ class context
|
||||
comment0.params=
|
||||
comment0.target=ImageViewer()
|
||||
comment0.text=\n\ Create\ an\ ImageViewer\ show\ it\ on\ screen.\n
|
||||
comment1.params=
|
||||
comment1.target=void\ openFile()
|
||||
comment1.text=\n\ Open\ function\:\ open\ a\ file\ chooser\ to\ select\ a\ new\ image\ file.\n
|
||||
comment2.params=
|
||||
comment2.target=void\ quit()
|
||||
comment2.text=\n\ Quit\ function\:\ quit\ the\ application.\n
|
||||
comment3.params=
|
||||
comment3.target=void\ makeFrame()
|
||||
comment3.text=\n\ Create\ the\ Swing\ frame\ and\ its\ content.\n
|
||||
comment4.params=frame
|
||||
comment4.target=void\ makeMenuBar(javax.swing.JFrame)
|
||||
comment4.text=\n\ Create\ the\ main\ frame's\ menu\ bar.\n\ @param\ frame\ \ \ The\ frame\ that\ the\ menu\ bar\ should\ be\ added\ to.\n
|
||||
numComments=5
|
@@ -0,0 +1,96 @@
|
||||
import java.awt.*;
|
||||
import java.awt.event.*;
|
||||
import javax.swing.*;
|
||||
|
||||
/**
|
||||
* ImageViewer is the main class of the image viewer application. It builds and
|
||||
* displays the application GUI and initialises all other components.
|
||||
*
|
||||
* To start the application, create an object of this class.
|
||||
*
|
||||
* @author Michael Kölling and David J. Barnes.
|
||||
* @version 0.4
|
||||
*/
|
||||
public class ImageViewer
|
||||
{
|
||||
private JFrame frame;
|
||||
private ImagePanel imagePanel;
|
||||
|
||||
/**
|
||||
* Create an ImageViewer show it on screen.
|
||||
*/
|
||||
public ImageViewer()
|
||||
{
|
||||
makeFrame();
|
||||
}
|
||||
|
||||
|
||||
// ---- implementation of menu functions ----
|
||||
|
||||
/**
|
||||
* Open function: open a file chooser to select a new image file.
|
||||
*/
|
||||
private void openFile()
|
||||
{
|
||||
OFImage image = ImageFileManager.getImage();
|
||||
imagePanel.setImage(image);
|
||||
frame.pack();
|
||||
}
|
||||
|
||||
/**
|
||||
* Quit function: quit the application.
|
||||
*/
|
||||
private void quit()
|
||||
{
|
||||
System.exit(0);
|
||||
}
|
||||
|
||||
// ---- swing stuff to build the frame and all its components ----
|
||||
|
||||
/**
|
||||
* Create the Swing frame and its content.
|
||||
*/
|
||||
private void makeFrame()
|
||||
{
|
||||
frame = new JFrame("ImageViewer");
|
||||
makeMenuBar(frame);
|
||||
|
||||
Container contentPane = frame.getContentPane();
|
||||
|
||||
imagePanel = new ImagePanel();
|
||||
contentPane.add(imagePanel);
|
||||
|
||||
// building is done - arrange the components and show
|
||||
frame.pack();
|
||||
frame.setVisible(true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create the main frame's menu bar.
|
||||
* @param frame The frame that the menu bar should be added to.
|
||||
*/
|
||||
private void makeMenuBar(JFrame frame)
|
||||
{
|
||||
final int SHORTCUT_MASK =
|
||||
Toolkit.getDefaultToolkit().getMenuShortcutKeyMask();
|
||||
|
||||
|
||||
JMenuBar menubar = new JMenuBar();
|
||||
frame.setJMenuBar(menubar);
|
||||
|
||||
// create the File manu
|
||||
JMenu fileMenu = new JMenu("File");
|
||||
menubar.add(fileMenu);
|
||||
|
||||
JMenuItem openItem = new JMenuItem("Open");
|
||||
openItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O, SHORTCUT_MASK));
|
||||
openItem.addActionListener(e -> openFile());
|
||||
fileMenu.add(openItem);
|
||||
|
||||
JMenuItem quitItem = new JMenuItem("Quit");
|
||||
quitItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Q, SHORTCUT_MASK));
|
||||
quitItem.addActionListener(e -> quit());
|
||||
fileMenu.add(quitItem);
|
||||
|
||||
}
|
||||
}
|
@@ -0,0 +1,14 @@
|
||||
#BlueJ class context
|
||||
comment0.params=image
|
||||
comment0.target=OFImage(java.awt.image.BufferedImage)
|
||||
comment0.text=\n\ Create\ an\ OFImage\ copied\ from\ a\ BufferedImage.\n\ @param\ image\ The\ image\ to\ copy.\n
|
||||
comment1.params=width\ height
|
||||
comment1.target=OFImage(int,\ int)
|
||||
comment1.text=\n\ Create\ an\ OFImage\ with\ specified\ size\ and\ unspecified\ content.\n\ @param\ width\ The\ width\ of\ the\ image.\n\ @param\ height\ The\ height\ of\ the\ image.\n
|
||||
comment2.params=x\ y\ col
|
||||
comment2.target=void\ setPixel(int,\ int,\ java.awt.Color)
|
||||
comment2.text=\n\ Set\ a\ given\ pixel\ of\ this\ image\ to\ a\ specified\ color.\ The\n\ color\ is\ represented\ as\ an\ (r,g,b)\ value.\n\ @param\ x\ The\ x\ position\ of\ the\ pixel.\n\ @param\ y\ The\ y\ position\ of\ the\ pixel.\n\ @param\ col\ The\ color\ of\ the\ pixel.\n
|
||||
comment3.params=x\ y
|
||||
comment3.target=java.awt.Color\ getPixel(int,\ int)
|
||||
comment3.text=\n\ Get\ the\ color\ value\ at\ a\ specified\ pixel\ position.\n\ @param\ x\ The\ x\ position\ of\ the\ pixel.\n\ @param\ y\ The\ y\ position\ of\ the\ pixel.\n\ @return\ The\ color\ of\ the\ pixel\ at\ the\ given\ position.\n
|
||||
numComments=4
|
@@ -0,0 +1,57 @@
|
||||
import java.awt.*;
|
||||
import java.awt.image.*;
|
||||
import javax.swing.*;
|
||||
|
||||
/**
|
||||
* OFImage is a class that defines an image in OF (Objects First) format.
|
||||
*
|
||||
* @author Michael Kölling and David J. Barnes.
|
||||
* @version 1.0
|
||||
*/
|
||||
public class OFImage extends BufferedImage
|
||||
{
|
||||
/**
|
||||
* Create an OFImage copied from a BufferedImage.
|
||||
* @param image The image to copy.
|
||||
*/
|
||||
public OFImage(BufferedImage image)
|
||||
{
|
||||
super(image.getColorModel(), image.copyData(null),
|
||||
image.isAlphaPremultiplied(), null);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create an OFImage with specified size and unspecified content.
|
||||
* @param width The width of the image.
|
||||
* @param height The height of the image.
|
||||
*/
|
||||
public OFImage(int width, int height)
|
||||
{
|
||||
super(width, height, TYPE_INT_RGB);
|
||||
}
|
||||
|
||||
/**
|
||||
* Set a given pixel of this image to a specified color. The
|
||||
* color is represented as an (r,g,b) value.
|
||||
* @param x The x position of the pixel.
|
||||
* @param y The y position of the pixel.
|
||||
* @param col The color of the pixel.
|
||||
*/
|
||||
public void setPixel(int x, int y, Color col)
|
||||
{
|
||||
int pixel = col.getRGB();
|
||||
setRGB(x, y, pixel);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the color value at a specified pixel position.
|
||||
* @param x The x position of the pixel.
|
||||
* @param y The y position of the pixel.
|
||||
* @return The color of the pixel at the given position.
|
||||
*/
|
||||
public Color getPixel(int x, int y)
|
||||
{
|
||||
int pixel = getRGB(x, y);
|
||||
return new Color(pixel);
|
||||
}
|
||||
}
|
@@ -0,0 +1,14 @@
|
||||
Project: imageviewer, version 0.4
|
||||
Authors: David Barnes and Michael Kölling
|
||||
|
||||
This project is part of the material for the book
|
||||
|
||||
Objects First with Java - A Practical Introduction using BlueJ
|
||||
Sixth edition
|
||||
David J. Barnes and Michael Kölling
|
||||
Pearson Education, 2016
|
||||
|
||||
It is discussed in chapter 13.
|
||||
|
||||
To use this project, create an instance of class ImageViewer.
|
||||
For details, refer to the book chapter.
|
@@ -0,0 +1,83 @@
|
||||
#BlueJ package file
|
||||
dependency1.from=ImageViewer
|
||||
dependency1.to=ImagePanel
|
||||
dependency1.type=UsesDependency
|
||||
dependency2.from=ImageViewer
|
||||
dependency2.to=OFImage
|
||||
dependency2.type=UsesDependency
|
||||
dependency3.from=ImageViewer
|
||||
dependency3.to=ImageFileManager
|
||||
dependency3.type=UsesDependency
|
||||
dependency4.from=ImageFileManager
|
||||
dependency4.to=OFImage
|
||||
dependency4.type=UsesDependency
|
||||
dependency5.from=ImagePanel
|
||||
dependency5.to=OFImage
|
||||
dependency5.type=UsesDependency
|
||||
objectbench.height=76
|
||||
objectbench.width=782
|
||||
package.editor.height=445
|
||||
package.editor.width=674
|
||||
package.editor.x=70
|
||||
package.editor.y=80
|
||||
package.numDependencies=5
|
||||
package.numTargets=4
|
||||
package.showExtends=true
|
||||
package.showUses=true
|
||||
project.charset=UTF-8
|
||||
readme.editor.height=557
|
||||
readme.editor.width=820
|
||||
readme.editor.x=53
|
||||
readme.editor.y=23
|
||||
target1.editor.height=714
|
||||
target1.editor.width=889
|
||||
target1.editor.x=50
|
||||
target1.editor.y=60
|
||||
target1.height=60
|
||||
target1.name=OFImage
|
||||
target1.naviview.expanded=true
|
||||
target1.showInterface=false
|
||||
target1.type=ClassTarget
|
||||
target1.typeParameters=
|
||||
target1.width=120
|
||||
target1.x=320
|
||||
target1.y=320
|
||||
target2.editor.height=733
|
||||
target2.editor.width=961
|
||||
target2.editor.x=532
|
||||
target2.editor.y=42
|
||||
target2.height=60
|
||||
target2.name=ImageFileManager
|
||||
target2.naviview.expanded=true
|
||||
target2.showInterface=false
|
||||
target2.type=ClassTarget
|
||||
target2.typeParameters=
|
||||
target2.width=140
|
||||
target2.x=430
|
||||
target2.y=180
|
||||
target3.editor.height=674
|
||||
target3.editor.width=938
|
||||
target3.editor.x=69
|
||||
target3.editor.y=90
|
||||
target3.height=60
|
||||
target3.name=ImageViewer
|
||||
target3.naviview.expanded=true
|
||||
target3.showInterface=false
|
||||
target3.type=ClassTarget
|
||||
target3.typeParameters=
|
||||
target3.width=120
|
||||
target3.x=220
|
||||
target3.y=70
|
||||
target4.editor.height=726
|
||||
target4.editor.width=907
|
||||
target4.editor.x=50
|
||||
target4.editor.y=60
|
||||
target4.height=60
|
||||
target4.name=ImagePanel
|
||||
target4.naviview.expanded=true
|
||||
target4.showInterface=false
|
||||
target4.type=ClassTarget
|
||||
target4.typeParameters=
|
||||
target4.width=120
|
||||
target4.x=60
|
||||
target4.y=180
|
Reference in New Issue
Block a user