See the previous iteration: Bare bones painter app in Java.
I have improved my program thanks to all the answers in the initial post. Now I have this:
App.java:
package net.coderodde.javapaint;
import javax.swing.JFrame;
/**
* This class implements an application for simple drawing.
*
* @author Rodion "rodde" Efremov
* @version 1.6 (Jun 8, 2016)
*/
public class App {
private static final String APP_TITLE = "JavaPaint";
private static final int APP_WINDOW_WIDTH = 640;
private static final int APP_WINDOW_HEIGHT = 480;
private final JFrame frame = new JFrame(APP_TITLE);
public App() {
frame.getContentPane()
.add(new PaintCanvas(APP_WINDOW_WIDTH, APP_WINDOW_HEIGHT));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setResizable(false);
frame.setVisible(true);
}
public static void main(final String[] args) {
final App app = new App();
}
}
PaintCanvas.java:
package net.coderodde.javapaint;
import java.awt.BasicStroke;
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import java.awt.image.BufferedImage;
/**
* This class implements a GUI component for drawing.
*
* @author Rodion "rodde" Efremov
* @version 1.6 (Jun 8, 2016)
*/
public class PaintCanvas extends Canvas {
/**
* The radius of the brush in pixels.
*/
private static final int BRUSH_RADIUS = 5;
/**
* The actual image being drawn to.
*/
private final BufferedImage image;
/**
* The graphics context of the above.
*/
private final Graphics2D imageGraphics;
public PaintCanvas(final int width, final int height) {
super();
super.setBounds(0, 0, width, height);
this.image = new BufferedImage(width,
height,
BufferedImage.TYPE_INT_RGB);
this.imageGraphics = this.image.createGraphics();
prepareScreen(width, height);
final PaintCanvasMouseListener listener =
new PaintCanvasMouseListener();
this.addMouseListener(listener);
this.addMouseMotionListener(listener);
}
@Override
public void paint(final Graphics g) {
update(g);
}
@Override
public void update(final Graphics g) {
g.drawImage(this.image, 0, 0, null);
}
private void prepareScreen(final int width, final int height) {
this.imageGraphics.setColor(Color.WHITE);
this.imageGraphics.fillRect(0, 0, width, height);
this.imageGraphics.setColor(Color.BLACK);
this.imageGraphics.setStroke(new BasicStroke(BRUSH_RADIUS));
}
private class PaintCanvasMouseListener
extends MouseAdapter implements MouseMotionListener {
private int previousX;
private int previousY;
@Override
public void mousePressed(final MouseEvent event) {
this.previousX = event.getX();
this.previousY = event.getY();
}
@Override
public void mouseClicked(final MouseEvent event) {
final int x = event.getX();
final int y = event.getY();
PaintCanvas.this.imageGraphics.drawLine(x, y, x, y);
}
@Override
public void mouseDragged(final MouseEvent event) {
final int currentX = event.getX();
final int currentY = event.getY();
PaintCanvas.this.imageGraphics.drawLine(previousX,
previousY,
currentX,
currentY);
PaintCanvas.this.repaint();
this.previousX = currentX;
this.previousY = currentY;
}
}
}
The new version allowed me to paint the following masterpiece:
Please, tell me anything that comes to mind.