Reputation: 11
I want to modify the program to connect the series of dots that make up one stroke of a letter with a straight line so that words can be drawn but i don't really have a idea of how to do it so i want some references. I tried to draw them using drawLine but it's not what i really wanted.
This is my code:
package tool;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.util.Vector;
import javax.swing.JFrame;
import javax.swing.JPanel;
class Point {
int x, y;
public Point(int x, int y) {
this.x = x;
this.y = y;
}
}
public class MyPaintApp extends JFrame {
int x, y;
Vector<Point> list = new Vector<>();
class MyPanel extends JPanel {
public MyPanel() {
addMouseMotionListener(new MouseMotionAdapter() {
public void mouseDragged(MouseEvent event) {
x = event.getX();
y = event.getY();
list.add(new Point(x, y));
repaint();
}
});
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
for (Point p : list)
g.fillOval(p.x, p.y, 4, 4);
}
}
public MyPaintApp() {
setSize(600, 450);
setLocation(400, 0);
setTitle("My Paint");
add(new MyPanel());
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.util.Vector;
import javax.swing.JFrame;
import javax.swing.JPanel;
class Point {
int x, y;
public Point(int x, int y) {
this.x = x;
this.y = y;
}
}
public class MyPaintApp extends JFrame {
int x, y;
Vector<Point> list = new Vector<>();
Vector<Vector<Point>> list1 = new Vector<>();
class MyPanel extends JPanel {
public MyPanel() {
addMouseMotionListener(new MouseMotionAdapter() {
public void mouseDragged(MouseEvent event) {
x = event.getX();
y = event.getY();
list.add(new Point(x, y));
repaint();
}
});
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
for (int i = 0; i < list.size() - 1; i++) {
Point p1 = list.get(i);
Point p2 = list.get(i + 1);
g.drawLine(p1.x, p1.y, p2.x, p2.y);
}
}
}
public MyPaintApp() {
setSize(600, 450);
setLocation(400, 0);
setTitle("My Paint");
add(new MyPanel());
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
Upvotes: 1
Views: 157
Reputation: 11
import java.awt.BasicStroke;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.util.Vector;
import javax.swing.JFrame;
import javax.swing.JPanel;
class Point {
int x, y;
public Point(int x, int y) {
this.x = x;
this.y = y;
}
}
public class MyPaintApp extends JFrame {
int x, y;
Vector<Point> list = new Vector<>();
boolean isMousePressed = false;
class MyPanel extends JPanel {
public MyPanel() {
addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent event) {
isMousePressed = true;
x = event.getX();
y = event.getY();
list.add(new Point(x, y));
}
public void mouseReleased(MouseEvent event) {
isMousePressed = false;
}
});
addMouseMotionListener(new MouseMotionAdapter() {
public void mouseDragged(MouseEvent event) {
if(isMousePressed) {
x = event.getX();
y = event.getY();
list.add(new Point(x, y));
repaint();
}
}
public void mouseMoved(MouseEvent event) {
if(isMousePressed) {
x = event.getX();
y = event.getY();
list.add(new Point(x, y));
repaint();
}
}
});
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2d.setStroke(new BasicStroke(2.0f));
for (Point p : list)
g.fillOval(p.x, p.y, 4, 4);
}
}
public MyPaintApp() {
setSize(600, 450);
setLocation(400, 0);
setTitle("My Paint");
add(new MyPanel());
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
Upvotes: -1
Reputation: 347184
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Main {
public static void main(String[] args) {
new Main();
}
public Main() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
JFrame frame = new JFrame();
frame.add(new MyPanel());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
class MyPanel extends JPanel {
private List<List<Point>> shapes = new ArrayList<>(8);
private List<Point> currentShape;
public MyPanel() {
MouseAdapter handler = new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
currentShape = new ArrayList<>(64);
}
@Override
public void mouseReleased(MouseEvent e) {
shapes.add(currentShape);
currentShape = null;
}
@Override
public void mouseDragged(MouseEvent e) {
currentShape.add(new Point(e.getX(), e.getY()));
repaint();
}
};
addMouseMotionListener(handler);
addMouseListener(handler);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(800, 600);
}
@Override
protected void paintComponent(Graphics g) {
Graphics2D g2d = (Graphics2D) g.create();
super.paintComponent(g2d);
for (List<Point> shape : shapes) {
paintShape(shape, g2d);
}
if (currentShape != null) {
paintShape(currentShape, g2d);
}
g2d.dispose();
}
protected void paintShape(List<Point> shape, Graphics2D g2d) {
Point from = null;
for (Point p : shape) {
Point to = p;
if (from != null) {
g2d.drawLine(from.x, from.y, to.x, to.y);
}
from = to;
}
}
}
}
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.geom.Line2D;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Main {
public static void main(String[] args) {
new Main();
}
public Main() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
JFrame frame = new JFrame();
frame.add(new MyPanel());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
class MyPanel extends JPanel {
private List<Line2D> lines = new ArrayList<>(8);
private Line2D nextLine;
public MyPanel() {
MouseAdapter handler = new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
if (nextLine != null) {
lines.add(nextLine);
}
nextLine = new Line2D.Double(e.getPoint(), e.getPoint());
repaint();
}
@Override
public void mouseMoved(MouseEvent e) {
if (nextLine == null) {
return;
}
nextLine.setLine(nextLine.getP1(), e.getPoint());
repaint();
}
};
addMouseListener(handler);
addMouseMotionListener(handler);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(800, 600);
}
@Override
protected void paintComponent(Graphics g) {
Graphics2D g2d = (Graphics2D) g.create();
super.paintComponent(g2d);
for (Line2D line : lines) {
g2d.draw(line);
}
if (nextLine != null) {
g2d.setColor(Color.RED);
g2d.draw(nextLine);
}
g2d.dispose();
}
protected void paintShape(List<Point> shape, Graphics2D g2d) {
Point from = null;
for (Point p : shape) {
Point to = p;
if (from != null) {
g2d.drawLine(from.x, from.y, to.x, to.y);
}
from = to;
}
}
}
}
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.geom.Line2D;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Main {
public static void main(String[] args) {
new Main();
}
public Main() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
JFrame frame = new JFrame();
frame.add(new MyPanel());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
class MyPanel extends JPanel {
private List<Line2D> lines = new ArrayList<>(8);
private Line2D nextLine;
public MyPanel() {
MouseAdapter handler = new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
if (nextLine != null) {
lines.add(nextLine);
nextLine = null;
} else {
nextLine = new Line2D.Double(e.getPoint(), e.getPoint());
}
repaint();
}
@Override
public void mouseMoved(MouseEvent e) {
if (nextLine == null) {
return;
}
nextLine.setLine(nextLine.getP1(), e.getPoint());
repaint();
}
};
addMouseListener(handler);
addMouseMotionListener(handler);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(800, 600);
}
@Override
protected void paintComponent(Graphics g) {
Graphics2D g2d = (Graphics2D) g.create();
super.paintComponent(g2d);
for (Line2D line : lines) {
g2d.draw(line);
}
if (nextLine != null) {
g2d.setColor(Color.RED);
g2d.draw(nextLine);
}
g2d.dispose();
}
protected void paintShape(List<Point> shape, Graphics2D g2d) {
Point from = null;
for (Point p : shape) {
Point to = p;
if (from != null) {
g2d.drawLine(from.x, from.y, to.x, to.y);
}
from = to;
}
}
}
}
Vector
, use ArrayList
, you probably won't notice it, but ArrayList
will be fasterPoint
class, don't re-invent the wheelpaintComponent
should be protected
, there's no reason for anyone else to be calling itUpvotes: 3
Reputation: 1541
import java.util.Vector;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class MyPaintApp extends JFrame {
Vector<Point> list = new Vector<>();
Vector<Vector<Point>> list1 = new Vector<>();
class MyPanel extends JPanel {
public MyPanel() {
final MouseAdapter mouseAdapter =
new MouseAdapter() {
public void mouseDragged(MouseEvent event) {
repaint();
list.add(event.getPoint());
}
public void mouseMoved(MouseEvent event) {
repaint();
}
public void mouseReleased(MouseEvent event) {
if (list.isEmpty()){
return;
}
list1.add(list);
list = new Vector<>();
repaint();
}
}
;
this.addMouseMotionListener(mouseAdapter);
this.addMouseListener(mouseAdapter);
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
for (final Vector<Point> listA : list1) {
for (int i = 0; i < listA.size() - 1; i++) {
Point p1 = listA.get(i);
Point p2 = listA.get(i + 1);
g.drawLine(p1.x, p1.y, p2.x, p2.y);
}
}
}
}
@SuppressWarnings("this-escape")
public MyPaintApp() {
setSize(600, 450);
setLocation(400, 0);
setTitle("My Paint");
add(new MyPanel());
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] args)
{
new MyPaintApp();
}
}
In this case, we don't even create any of the dots that you did. All we did is grab the point from the event using MouseEvent.getPoint()
, then add it to our Vector
. I also changed your MouseMotionAdapter
to just be a plain MouseAdapter
. Doing so gives us the mouseMoved
, which I just used to reset our Vector
and start a new one. Have to run, so I can answer questions when I get back.
Upvotes: 0