Learn how to make a Swing painting and drawing application
In this video tutorial, you’re going to learn how to create a Swing painting and drawing application. Main goal is to learn how to draw in 2D in Java Swing component. Tutorial has a Youtube live coding video and also some explanations here with source code. Don’t hesitate to give me your feedbacks and comments.
Video is here :
Swing paint application has 2 Java classes :
* First is DrawArea which is used to manage draw area on the application. It uses an Image where we draw content before to display thanks to Graphics context. Code is here :
package com.ssaurel.swingpaint; import java.awt.Color; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Image; import java.awt.RenderingHints; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseMotionAdapter; import javax.swing.JComponent; /** * Component for drawing ! * * @author sylsau * */ public class DrawArea extends JComponent { // Image in which we're going to draw private Image image; // Graphics2D object ==> used to draw on private Graphics2D g2; // Mouse coordinates private int currentX, currentY, oldX, oldY; public DrawArea() { setDoubleBuffered(false); addMouseListener(new MouseAdapter() { public void mousePressed(MouseEvent e) { // save coord x,y when mouse is pressed oldX = e.getX(); oldY = e.getY(); } }); addMouseMotionListener(new MouseMotionAdapter() { public void mouseDragged(MouseEvent e) { // coord x,y when drag mouse currentX = e.getX(); currentY = e.getY(); if (g2 != null) { // draw line if g2 context not null g2.drawLine(oldX, oldY, currentX, currentY); // refresh draw area to repaint repaint(); // store current coords x,y as olds x,y oldX = currentX; oldY = currentY; } } }); } protected void paintComponent(Graphics g) { if (image == null) { // image to draw null ==> we create image = createImage(getSize().width, getSize().height); g2 = (Graphics2D) image.getGraphics(); // enable antialiasing g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); // clear draw area clear(); } g.drawImage(image, 0, 0, null); } // now we create exposed methods public void clear() { g2.setPaint(Color.white); // draw white on entire draw area to clear g2.fillRect(0, 0, getSize().width, getSize().height); g2.setPaint(Color.black); repaint(); } public void red() { // apply red color on g2 context g2.setPaint(Color.red); } public void black() { g2.setPaint(Color.black); } public void magenta() { g2.setPaint(Color.magenta); } public void green() { g2.setPaint(Color.green); } public void blue() { g2.setPaint(Color.blue); } }
* Second is SwingPaint that contains main method to launch application. It assembles some Swing UI components to display DrawArea and listen mouse events. Code is here :
package com.ssaurel.swingpaint; import java.awt.BorderLayout; import java.awt.Container; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; public class SwingPaint { JButton clearBtn, blackBtn, blueBtn, greenBtn, redBtn, magentaBtn; DrawArea drawArea; ActionListener actionListener = new ActionListener() { public void actionPerformed(ActionEvent e) { if (e.getSource() == clearBtn) { drawArea.clear(); } else if (e.getSource() == blackBtn) { drawArea.black(); } else if (e.getSource() == blueBtn) { drawArea.blue(); } else if (e.getSource() == greenBtn) { drawArea.green(); } else if (e.getSource() == redBtn) { drawArea.red(); } else if (e.getSource() == magentaBtn) { drawArea.magenta(); } } }; public static void main(String[] args) { new SwingPaint().show(); } public void show() { // create main frame JFrame frame = new JFrame("Swing Paint"); Container content = frame.getContentPane(); // set layout on content pane content.setLayout(new BorderLayout()); // create draw area drawArea = new DrawArea(); // add to content pane content.add(drawArea, BorderLayout.CENTER); // create controls to apply colors and call clear feature JPanel controls = new JPanel(); clearBtn = new JButton("Clear"); clearBtn.addActionListener(actionListener); blackBtn = new JButton("Black"); blackBtn.addActionListener(actionListener); blueBtn = new JButton("Blue"); blueBtn.addActionListener(actionListener); greenBtn = new JButton("Green"); greenBtn.addActionListener(actionListener); redBtn = new JButton("Red"); redBtn.addActionListener(actionListener); magentaBtn = new JButton("Magenta"); magentaBtn.addActionListener(actionListener); // add to panel controls.add(greenBtn); controls.add(blueBtn); controls.add(blackBtn); controls.add(redBtn); controls.add(magentaBtn); controls.add(clearBtn); // add to content pane content.add(controls, BorderLayout.NORTH); frame.setSize(600, 600); // can close frame frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // show the swing paint result frame.setVisible(true); // Now you can try our Swing Paint !!! Enjoy :D } }
Don’t hesitate to comment if you have questions :).
Leave a Reply
You must be logged in to post a comment.