import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import java.awt.Color; import java.awt.Font; import java.awt.FontMetrics; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseMotionAdapter; import java.awt.Image; import java.awt.Rectangle; import java.awt.image.BufferedImage; import java.awt.image.ImageObserver; public class SimplePaintWithBuffer extends JPanel implements ImageObserver { private boolean painting = false; private int currentX, currentY; private BufferedImage image; private Graphics2D graphics; public static final int WINDOW_WIDTH = 640; public static final int WINDOW_HEIGHT = 480; public static void main(final String[] args) { JFrame frame = new JFrame("Smile!"); frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); frame.setSize(WINDOW_WIDTH, WINDOW_HEIGHT); frame.setLocationRelativeTo(null); SimplePaintWithBuffer paint = new SimplePaintWithBuffer(); frame.setContentPane(paint); paint.init(); // Important: put this after everything else. frame.setVisible(true); } public SimplePaintWithBuffer() { } public void init() { image = new BufferedImage(WINDOW_WIDTH, WINDOW_HEIGHT, BufferedImage.TYPE_INT_RGB); graphics = image.createGraphics(); addMouseListener(new MouseAdapter() { public void mousePressed(MouseEvent e) { painting = true; currentX = e.getX(); currentY = e.getY(); writeImage(); repaint(); } public void mouseReleased(MouseEvent e) { painting = false; } }); addMouseMotionListener(new MouseMotionAdapter() { public void mouseDragged(MouseEvent e) { currentX = e.getX(); currentY = e.getY(); writeImage(); repaint(); } }); } public void writeImage() { graphics.setColor(Color.green); graphics.fillOval(currentX - 4, currentY - 4, 8, 8); String coords = "X: " + currentX + " Y: " + currentY; FontMetrics metrics = graphics.getFontMetrics(); Rectangle rect = metrics.getStringBounds(coords, graphics).getBounds(); graphics.setColor(getBackground()); graphics.fillRect(10, WINDOW_HEIGHT - 50 - rect.height, rect.width + 20, rect.height); graphics.setColor(Color.black); graphics.drawString(coords, 10, WINDOW_HEIGHT - 50); } public boolean imageUpdate(Image img, int infoflags, int x, int y, int width, int height) { return false; } public void paint(Graphics g) { Graphics2D g2d = (Graphics2D)g; g2d.drawImage(image, 0, 0, Color.white, this); } }