In: Computer Science
The question I have is that I want to draw without having to drag and then clicking the button whether I want a line or rectangle. It should work first by hitting either the line or rectangle button and then making a drag on the panel with mouse, then after releasing the drag it creates the graphic.
Here is my current code.
package Mod1; import java.awt.*; import java.awt.event.*; import javax.swing.*; class paintGUI 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 paintGUI() { setDoubleBuffered(false); addMouseListener(new MouseAdapter() { public void mousePressed(MouseEvent e) { // save coord x,y when mouse is pressed oldX = e.getX(); oldY = e.getY(); System.out.println("Mouse pressed"); } }); addMouseMotionListener(new MouseMotionAdapter() { public void mouseDragged(MouseEvent e) { System.out.println("Mouse dragged"); // coord x,y when drag mouse currentX = e.getX(); currentY = e.getY(); } }); } protected void paintComponent(Graphics g) { if (image == null) { // image to draw null ==> we create image = createImage(getSize().width, getSize().height); g2 = (Graphics2D) image.getGraphics(); // clear draw area clear(); } g.drawImage(image, 0, 0, null); repaint(); } // now we create exposed methods public void clear() { g2.clearRect(0, 0, getSize().width, getSize().height); repaint(); } public void thin() { g2.setStroke(new BasicStroke(3)); } public void thick() { g2.setStroke(new BasicStroke(10)); } 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 drawLine() { System.out.println("Drawing line"); g2.drawLine(oldX, oldY, currentX, currentY); repaint(); } public void drawRectangle() { System.out.println("Drawing rectangle"); g2.drawRect(oldX, oldY, Math.abs(currentX - oldX), Math.abs(currentY - oldY)); g2.fillRect(oldX, oldY, Math.abs(currentX - oldX), Math.abs(currentY - oldY)); repaint(); } } public class GUIPaint { JButton clearBtn, blackBtn, redBtn, magentaBtn, filledRectangleBtn, lineBtn, thinBtn, thickBtn; paintGUI paintGUI; ActionListener actionListener = new ActionListener() { public void actionPerformed(ActionEvent e) { if (e.getSource() == clearBtn) { paintGUI.clear(); } else if (e.getSource() == thinBtn) { paintGUI.thin(); } else if (e.getSource() == thickBtn) { paintGUI.thick(); } else if (e.getSource() == blackBtn) { paintGUI.black(); } else if (e.getSource() == redBtn) { paintGUI.red(); } else if (e.getSource() == magentaBtn) { paintGUI.magenta(); } else if (e.getSource() == filledRectangleBtn) { paintGUI.drawRectangle(); } else if (e.getSource() == lineBtn) { paintGUI.drawLine(); } } }; public static void main(String[] args) { new GUIPaint().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 paintGUI = new paintGUI(); // add to content pane content.add(paintGUI, 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); redBtn = new JButton("Red"); redBtn.addActionListener(actionListener); magentaBtn = new JButton("Magenta"); magentaBtn.addActionListener(actionListener); lineBtn = new JButton("Line"); lineBtn.addActionListener(actionListener); filledRectangleBtn = new JButton("Filled Rectangle"); filledRectangleBtn.addActionListener(actionListener); thickBtn = new JButton("Thick Line"); thickBtn.addActionListener(actionListener); thinBtn = new JButton("Thin Line"); thinBtn.addActionListener(actionListener); controls.add(lineBtn); controls.add(filledRectangleBtn); controls.add(thinBtn); controls.add(thickBtn); controls.add(blackBtn); controls.add(redBtn); controls.add(magentaBtn); controls.add(clearBtn); // add to content pane content.add(controls, BorderLayout.NORTH); frame.setSize(800, 800); // can close frame frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // show the swing paint result frame.setVisible(true); } }
import java.awt.BasicStroke; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Container; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Image; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseMotionAdapter; import javax.swing.JButton; import javax.swing.JComponent; import javax.swing.JFrame; import javax.swing.JPanel; class paintGUI 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; private String shape = "line"; public paintGUI() { setDoubleBuffered(false); addMouseListener(new MouseAdapter() { public void mousePressed(MouseEvent e) { // save coord x,y when mouse is pressed oldX = e.getX(); oldY = e.getY(); System.out.println("Mouse pressed"); } public void mouseReleased(MouseEvent e) { // save coord x,y when mouse is pressed currentX = e.getX(); currentY = e.getY(); if(shape.equals("line")) { drawLine(); } else if(shape.equals("rectangle")) { drawRectangle(); } } }); } protected void paintComponent(Graphics g) { if (image == null) { // image to draw null ==> we create image = createImage(getSize().width, getSize().height); g2 = (Graphics2D) image.getGraphics(); // clear draw area clear(); thin(); } g.drawImage(image, 0, 0, null); repaint(); } // now we create exposed methods public void clear() { g2.clearRect(0, 0, getSize().width, getSize().height); repaint(); } public void thin() { g2.setStroke(new BasicStroke(3)); } public void thick() { g2.setStroke(new BasicStroke(10)); } 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 setShape(String shape) { this.shape = shape; } public void drawLine() { g2.drawLine(oldX, oldY, currentX, currentY); repaint(); } public void drawRectangle() { g2.drawRect(oldX, oldY, Math.abs(currentX - oldX), Math.abs(currentY - oldY)); g2.fillRect(oldX, oldY, Math.abs(currentX - oldX), Math.abs(currentY - oldY)); repaint(); } } public class GUIPaint { JButton clearBtn, blackBtn, redBtn, magentaBtn, filledRectangleBtn, lineBtn, thinBtn, thickBtn; paintGUI paintGUI; ActionListener actionListener = new ActionListener() { public void actionPerformed(ActionEvent e) { if (e.getSource() == clearBtn) { paintGUI.clear(); } else if (e.getSource() == thinBtn) { paintGUI.thin(); } else if (e.getSource() == thickBtn) { paintGUI.thick(); } else if (e.getSource() == blackBtn) { paintGUI.black(); } else if (e.getSource() == redBtn) { paintGUI.red(); } else if (e.getSource() == magentaBtn) { paintGUI.magenta(); } else if (e.getSource() == filledRectangleBtn) { paintGUI.setShape("rectangle"); } else if (e.getSource() == lineBtn) { paintGUI.setShape("line"); } } }; public static void main(String[] args) { new GUIPaint().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 paintGUI = new paintGUI(); // add to content pane content.add(paintGUI, 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); redBtn = new JButton("Red"); redBtn.addActionListener(actionListener); magentaBtn = new JButton("Magenta"); magentaBtn.addActionListener(actionListener); lineBtn = new JButton("Line"); lineBtn.addActionListener(actionListener); filledRectangleBtn = new JButton("Filled Rectangle"); filledRectangleBtn.addActionListener(actionListener); thickBtn = new JButton("Thick Line"); thickBtn.addActionListener(actionListener); thinBtn = new JButton("Thin Line"); thinBtn.addActionListener(actionListener); controls.add(lineBtn); controls.add(filledRectangleBtn); controls.add(thinBtn); controls.add(thickBtn); controls.add(blackBtn); controls.add(redBtn); controls.add(magentaBtn); controls.add(clearBtn); // add to content pane content.add(controls, BorderLayout.NORTH); frame.setSize(800, 800); // can close frame frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // show the swing paint result frame.setVisible(true); } }
************************************************** Thanks for your question. We try our best to help you with detailed answers, But in any case, if you need any modification or have a query/issue with respect to above answer, Please ask that in the comment section. We will surely try to address your query ASAP and resolve the issue.
Please consider providing a thumbs up to this question if it helps you. by Doing that, You will help other students, who are facing similar issue.