Reputation: 101
I am writing a program that draw line in Java, I used PaintComponent but I didn't know why it doesn't work. The below code I've wrote so far. Please help me. I created JFrame in other class.
package Paint;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.util.ArrayList;
import javax.swing.JPanel;
public class MousePanel extends JPanel {
private boolean start;
private Point last;
private ArrayList<Point> lines;
public MousePanel() {
start = false;
lines = new ArrayList<Point>();
addMouseListener(new MouseHandler());
addMouseMotionListener(new MouseMotionHandler());
setBackground(Color.white);
}
private class MouseHandler extends MouseAdapter {
public void mouseClicked(MouseEvent e) {
if (e.getButton() == e.BUTTON1) {
start = true;
last = new Point(e.getX(), e.getY());
lines.add(last);
}
if (e.getButton() == e.BUTTON3)
start = false;
}
}
private class MouseMotionHandler extends MouseMotionAdapter {
public void mouseMoved(MouseEvent e) {
if (start) {
last = new Point(e.getX(), e.getY());
lines.add(last);
repaint();
}
}
}
public void paintComponent(Graphics g){
super.paintComponent(g);
g.setColor(Color.black);
// draw all lines
if (lines.size()<2) return;
Point firstPoint = (Point)lines.get(0);
Point secondPoint;
for (int i = 1; i < lines.size(); i++){
secondPoint = (Point) lines.get(i);
g.drawLine(firstPoint.x, firstPoint.y, secondPoint.x, secondPoint.y);
firstPoint = secondPoint;
}
}
}
Upvotes: 0
Views: 63
Reputation: 1533
You need to use mousePressed
and mouseDragged
instead of mouseClicked
and mouseMoved
. I have re-factored your code. Hope it helps.
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import javax.swing.JPanel;
public class MousePanel extends JPanel {
private boolean start;
private Point last;
private ArrayList<Point> lines;
public MousePanel() {
start = false;
lines = new ArrayList<Point>();
MouseHandler mouseHandler = new MouseHandler();
addMouseListener(mouseHandler);
addMouseMotionListener(mouseHandler);
setBackground(Color.white);
}
private class MouseHandler extends MouseAdapter {
@Override
public void mousePressed(MouseEvent e) {
if (e.getButton() == MouseEvent.BUTTON1) {
start = true;
last = new Point(e.getX(), e.getY());
lines.add(last);
}
}
@Override
public void mouseReleased(MouseEvent e) {
if (e.getButton() == MouseEvent.BUTTON1) {
start = false;
}
}
@Override
public void mouseDragged(MouseEvent e) {
if (start) {
last = new Point(e.getX(), e.getY());
lines.add(last);
repaint();
}
}
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.black);
// draw all lines
if (lines.size() < 2) {
return;
}
Point firstPoint = (Point) lines.get(0);
Point secondPoint;
for (int i = 1; i < lines.size(); i++) {
secondPoint = (Point) lines.get(i);
g.drawLine(firstPoint.x, firstPoint.y, secondPoint.x, secondPoint.y);
firstPoint = secondPoint;
}
}
Upvotes: 1