From a45d37a4d5ca7b3ea9bfe724b20b834a2d8780de Mon Sep 17 00:00:00 2001 From: Wesley Date: Thu, 2 Apr 2015 23:31:48 +0200 Subject: [PATCH] Added path's works but allot is edited --- Applicatie/DrawObject.java | 2 - Applicatie/MenuBar.java | 11 +++ Applicatie/Panel.java | 88 +++++++++++++++++- Applicatie/PropertiesPanel.java | 37 ++++++-- Applicatie/Window.java | 8 +- Listeners/Keyboard.java | 13 +++ Listeners/Mouse.java | 159 +++++++++++++++++--------------- Listeners/MouseMotion.java | 12 ++- Objects/OldPath.java | 21 +++++ Objects/Path.java | 122 +++++++++++++++++++++--- images/newPath.png | Bin 0 -> 21189 bytes 11 files changed, 366 insertions(+), 107 deletions(-) create mode 100644 Objects/OldPath.java create mode 100644 images/newPath.png diff --git a/Applicatie/DrawObject.java b/Applicatie/DrawObject.java index 63f1b61..cf3f690 100644 --- a/Applicatie/DrawObject.java +++ b/Applicatie/DrawObject.java @@ -19,7 +19,6 @@ public abstract class DrawObject double rotation; double scale; private Image image; - private Image rotateImage; protected boolean selected; private Rectangle2D rektAngle; private Rectangle2D upperLeftCorner; @@ -36,7 +35,6 @@ public abstract class DrawObject public DrawObject(String filename, Point2D position) { image = new ImageIcon(filename).getImage(); - rotateImage = new ImageIcon("rotate.png").getImage(); scale = 1; rotation = 0; this.position = position; diff --git a/Applicatie/MenuBar.java b/Applicatie/MenuBar.java index ea7d268..343dbf9 100644 --- a/Applicatie/MenuBar.java +++ b/Applicatie/MenuBar.java @@ -17,6 +17,17 @@ public class MenuBar extends JMenuBar JMenu file = new JMenu("File"); + JMenuItem newPath = new JMenuItem("New Path"); + newPath.addActionListener(new ActionListener() { + + @Override + public void actionPerformed(ActionEvent e) { + w.getPanel().startPath(); + } + }); + + file.add(newPath); + JMenuItem exit = new JMenuItem("Exit"); exit.addActionListener(new ActionListener() { diff --git a/Applicatie/Panel.java b/Applicatie/Panel.java index db758a8..7c42f63 100644 --- a/Applicatie/Panel.java +++ b/Applicatie/Panel.java @@ -2,12 +2,16 @@ package Applicatie; import java.awt.BasicStroke; import java.awt.Color; +import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Point; +import java.awt.Stroke; import java.awt.TexturePaint; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; import java.awt.geom.AffineTransform; -import java.awt.geom.GeneralPath; +import java.awt.geom.Line2D; import java.awt.geom.NoninvertibleTransformException; import java.awt.geom.Point2D; import java.awt.geom.Rectangle2D; @@ -19,6 +23,7 @@ import java.util.Iterator; import javax.imageio.ImageIO; import javax.swing.JPanel; +import javax.swing.Timer; import Listeners.Mouse; import Listeners.MouseMotion; @@ -26,6 +31,7 @@ import Listeners.MouseWheel; import Objects.Entrance; import Objects.Food; import Objects.Path; +import Objects.OldPath; import Objects.Stage; import Objects.Toilet; import Objects.Wall; @@ -43,9 +49,11 @@ public class Panel extends JPanel // private ArrayList panelTypes = new ArrayList(); ArrayList objects = new ArrayList<>(); + ArrayList paths = new ArrayList<>(); DrawObject dragObject = null; private DrawObject selectedObject; private String clickedOption = "drag"; + private Path currentPath; Point2D cameraPoint = new Point2D.Double(getWidth() / 2, getHeight() / 2); float cameraScale = 1; @@ -132,7 +140,7 @@ public class Panel extends JPanel case 2: return new Entrance(null); case 3: - return new Path(null); + return new OldPath(null); case 4: return new Wall(null); case 5: @@ -152,8 +160,10 @@ public class Panel extends JPanel super.paintComponent(g); Graphics2D g2 = (Graphics2D) g; g2.setClip(new Rectangle2D.Double(0, 0, getWidth(), 300)); - + Stroke old = g2.getStroke(); + g2.setStroke(new BasicStroke(10)); g2.drawLine(0, 150, getWidth(), 150); + g2.setStroke(old); for (BufferedImage image : panelInfo) { g2.drawImage(image, panelInfox + scrollfactor, panelInfoy, null); @@ -171,13 +181,23 @@ public class Panel extends JPanel BasicStroke stroke = new BasicStroke(10); g2.setStroke(stroke); + + for(Path path : paths) { + path.draw(g2); + } for (DrawObject o : objects) { o.draw(g2); } + g2.setTransform(oldTransform); + if(currentPath != null) { //Display text while in path making modes. + g2.setColor(Color.WHITE); + g2.setFont(new Font("Verdana",Font.ITALIC,25)); + g2.drawString("Press enter to finish the path.",20,185); + } g2.setClip(null); - g2.setTransform(oldTransform); + } public AffineTransform getCamera() @@ -335,6 +355,10 @@ public class Panel extends JPanel this.clickedOption = clickedOption; } + /** + * Remove a DrawObject from the list. + * @param o - the DrawObject you want to remove from the list. + */ public void removeObject(DrawObject o) { Iterator itr = objects.iterator(); @@ -369,7 +393,63 @@ public class Panel extends JPanel } } + /** + * Begin making a new path. + */ + public void startPath() { + setClickedOption("Path"); + currentPath = new Path(); + paths.add(currentPath); + pp.setSelectedPath(currentPath); + } + /** + * Get the current selected Path. + * @return - the selected Path. + */ + public Path getCurrentPath() { + return currentPath; + } + /** + * Set the selected Path object. + * @param path - the selected Path object. + */ + public void setcurrentPath(Path path) { + currentPath = path; + pp.setSelectedPath(currentPath); + } + /** + * Checks if the point is contained in one of the path's. + * @param point - The point to check for. + * @return if the point is contained in one of the path's. + */ + public boolean checkPath(Point2D point) { + for(Path path : paths) { + if(path.containsPoint(point)) { + setcurrentPath(path); + setClickedOption("Path"); + return true; + } + } + return false; + } + + /** + * Remove a path from the list. + * @param path - the path you want to remove from the list. + */ + public void removePath(Path path) { + Iterator it = paths.iterator(); + while(it.hasNext()) { + if(it.next().equals(path)) { + pp.clearSelected(); + setClickedOption("drag"); + currentPath = null; + it.remove(); + } + repaint(); + } + } } diff --git a/Applicatie/PropertiesPanel.java b/Applicatie/PropertiesPanel.java index e1b154e..ba9b0b8 100644 --- a/Applicatie/PropertiesPanel.java +++ b/Applicatie/PropertiesPanel.java @@ -20,15 +20,20 @@ import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JTextField; +import Objects.Path; + @SuppressWarnings("serial") public class PropertiesPanel extends JPanel { DrawObject selectedObject = null; + Path selectedPath = null; + Panel p = null; Dimension spacerDimension = new Dimension(200, 30); + JLabel nameLabel; JTextField locationXField; @@ -84,7 +89,11 @@ public class PropertiesPanel extends JPanel { public void actionPerformed(ActionEvent e) { - p.removeObject(selectedObject); + if(selectedObject != null) + p.removeObject(selectedObject); + else if(selectedPath != null) { + p.removePath(selectedPath); + } } }); deletePanel.setPreferredSize(new Dimension(200, 50)); @@ -296,6 +305,7 @@ public class PropertiesPanel extends JPanel public void setSelected(DrawObject drOb) { selectedObject = drOb; + selectedPath = null; fillFields(); enableComponents(this, true); } @@ -305,11 +315,13 @@ public class PropertiesPanel extends JPanel enableComponents(this, false); clearFields(this); selectedObject = null; + selectedPath = null; } public void update() { - fillFields(); + if(selectedObject != null) + fillFields(); } private void enableComponents(Container container, boolean enable) @@ -348,21 +360,32 @@ public class PropertiesPanel extends JPanel private void fillFields() { - if (selectedObject != null) - { + nameLabel.setText(selectedObject.getName()); locationXField.setText(Math.round(selectedObject.getPosition().getX()) + ""); locationYField.setText(Math.round(selectedObject.getPosition().getY()) + ""); scaleField.setText((double) Math.round(selectedObject.getScale() * 10) / 10 + ""); rotationField.setText(Math.round(selectedObject.getRotation() % 360) + ""); - - } - } public void setPanel(Panel p) { this.p = p; } + + public void setSelectedPath(Path path) { + selectedObject = null; + selectedPath = path; + fillPathFields(); + } + + private void fillPathFields() { + nameLabel.setText("Path"); + enableComponents(this, true); + locationXField.setEnabled(false); + locationYField.setEnabled(false); + scaleField.setEnabled(false); + rotationField.setEnabled(false); + } } diff --git a/Applicatie/Window.java b/Applicatie/Window.java index fda7174..d696261 100644 --- a/Applicatie/Window.java +++ b/Applicatie/Window.java @@ -11,6 +11,8 @@ public class Window extends JFrame { private static final long serialVersionUID = -1324363758675184283L; + private Panel fp; + Window() { super("Festival Plannner"); setDefaultCloseOperation(EXIT_ON_CLOSE); @@ -20,7 +22,7 @@ public class Window extends JFrame // CONTENT PANELS JPanel contentPanel = new JPanel(new BorderLayout()); PropertiesPanel pp = new PropertiesPanel(); - Panel fp = new Panel(pp); + fp = new Panel(pp); contentPanel.add(fp, BorderLayout.CENTER); contentPanel.add(pp, BorderLayout.EAST); @@ -35,4 +37,8 @@ public class Window extends JFrame setFocusable(true); setVisible(true); } + + public Panel getPanel() { + return fp; + } } diff --git a/Listeners/Keyboard.java b/Listeners/Keyboard.java index d9a3c33..b2c5984 100644 --- a/Listeners/Keyboard.java +++ b/Listeners/Keyboard.java @@ -20,6 +20,8 @@ public class Keyboard implements KeyListener { if(e.getKeyCode() == e.VK_DELETE ) { if(panel.getSelectedObject() != null) panel.removeObject(panel.getSelectedObject()); + else if(panel.getCurrentPath() != null) + panel.removePath(panel.getCurrentPath()); } else if(e.getKeyCode() == e.VK_LEFT) { if(panel.getSelectedObject() != null) @@ -41,6 +43,17 @@ public class Keyboard implements KeyListener { panel.getSelectedObject().setPosition(new Point2D.Double(panel.getSelectedObject().getPosition().getX(),panel.getSelectedObject().getPosition().getY()+5)); panel.checkCollision(); } + else if(e.getKeyCode() == e.VK_ENTER) { + if(panel.getClickedOption().equals("Path")) { + panel.setClickedOption("drag"); + panel.getCurrentPath().setTempPoint(null); + panel.setcurrentPath(null); + panel.getPP().clearSelected(); + } + } + else if(e.getKeyCode() == e.VK_P) { + panel.startPath(); + } panel.repaint(); } diff --git a/Listeners/Mouse.java b/Listeners/Mouse.java index 0ae68a6..6f50d83 100644 --- a/Listeners/Mouse.java +++ b/Listeners/Mouse.java @@ -27,93 +27,100 @@ public class Mouse extends MouseAdapter Point2D clickPoint = panel.getClickPoint(e.getPoint()); panel.setLastClickPosition(clickPoint); panel.setLastMousePosition(e.getPoint()); - if (e.getY() < 150) - { - int i = 0; - int last = 0; - for (BufferedImage image : panel.getPanelInfo()) + if(!panel.getClickedOption().equals("Path")) { + if (e.getY() < 150) { - if (e.getX() >= panel.getScrollfactor() && e.getX() < last + image.getWidth() + panel.getScrollfactor()) + int i = 0; + int last = 0; + for (BufferedImage image : panel.getPanelInfo()) { - DrawObject tempDrawObj = panel.createNewDrawObject(i); - tempDrawObj.setPosition(clickPoint); - if(!panel.getObjects().isEmpty()) - panel.clearObjectSelection(); - panel.setDragObject(tempDrawObj); - panel.getDragObject().setSelected(true); - panel.getPP().setSelected(tempDrawObj); - panel.setSelectedObject(tempDrawObj); - selectedObject = tempDrawObj; - break; - } - i++; - last += image.getWidth(); - } - if (panel.getDragObject() != null) - { - panel.add(panel.getDragObject()); - } - } - else - { - for (DrawObject o : panel.getObjects()) - { - if (o.contains(clickPoint)) - { - if (o == selectedObject) + if (e.getX() >= panel.getScrollfactor() && e.getX() < last + image.getWidth() + panel.getScrollfactor()) { - boolean upperLeft = o.containsCorner(clickPoint, 0); - boolean upperRight = o.containsCorner(clickPoint, 1); - boolean bottomLeft = o.containsCorner(clickPoint, 2); - boolean bottomRight = o.containsCorner(clickPoint, 3); - boolean rotate = o.containsCorner(clickPoint, 4); - if (upperLeft) - { - panel.setClickedOption("upperLeft"); - } - else if (upperRight) - { - panel.setClickedOption("upperRight"); - } - else if (bottomLeft) - { - panel.setClickedOption("bottomLeft"); - } - else if (bottomRight) - { - panel.setClickedOption("bottomRight"); - } - else if (rotate) - { - panel.setClickedOption("rotate"); - } - else - { - panel.setClickedOption("drag"); - } + DrawObject tempDrawObj = panel.createNewDrawObject(i); + tempDrawObj.setPosition(clickPoint); + if(!panel.getObjects().isEmpty()) + panel.clearObjectSelection(); + panel.setDragObject(tempDrawObj); + panel.getDragObject().setSelected(true); + panel.getPP().setSelected(tempDrawObj); + panel.setSelectedObject(tempDrawObj); + selectedObject = tempDrawObj; + break; } - if (selectedObject != null) - selectedObject.setSelected(false); - o.setSelected(true); - selectedObject = o; - panel.setDragObject(o); - panel.getPP().setSelected(o); - panel.setSelectedObject(o); - panel.setSelectionPosition(panel.getDragObject().getPosition()); - + i++; + last += image.getWidth(); + } + if (panel.getDragObject() != null) + { + panel.add(panel.getDragObject()); } } + else + { + for (DrawObject o : panel.getObjects()) + { + if (o.contains(clickPoint)) + { + if (o == selectedObject) + { + boolean upperLeft = o.containsCorner(clickPoint, 0); + boolean upperRight = o.containsCorner(clickPoint, 1); + boolean bottomLeft = o.containsCorner(clickPoint, 2); + boolean bottomRight = o.containsCorner(clickPoint, 3); + boolean rotate = o.containsCorner(clickPoint, 4); + if (upperLeft) + { + panel.setClickedOption("upperLeft"); + } + else if (upperRight) + { + panel.setClickedOption("upperRight"); + } + else if (bottomLeft) + { + panel.setClickedOption("bottomLeft"); + } + else if (bottomRight) + { + panel.setClickedOption("bottomRight"); + } + else if (rotate) + { + panel.setClickedOption("rotate"); + } + else + { + panel.setClickedOption("drag"); + } + } + if (selectedObject != null) + selectedObject.setSelected(false); + o.setSelected(true); + selectedObject = o; + panel.setDragObject(o); + panel.getPP().setSelected(o); + panel.setSelectedObject(o); + panel.setSelectionPosition(panel.getDragObject().getPosition()); + + } + } + panel.checkPath(clickPoint); + } + if (panel.getDragObject() == null && selectedObject != null) + { + selectedObject.setSelected(false); + panel.setSelectedObject(null); + panel.getPP().clearSelected(); + selectedObject = null; + } } - if (panel.getDragObject() == null && selectedObject != null) - { - selectedObject.setSelected(false); - panel.setSelectedObject(null); - panel.getPP().clearSelected(); - selectedObject = null; + else { //Making path. + panel.getCurrentPath().addPoint(new Point2D.Double(clickPoint.getX(),clickPoint.getY())); } panel.repaint(); } + public void mouseReleased(MouseEvent e) { if(panel.getDragObject() != null) { diff --git a/Listeners/MouseMotion.java b/Listeners/MouseMotion.java index 5355da5..a40a559 100644 --- a/Listeners/MouseMotion.java +++ b/Listeners/MouseMotion.java @@ -26,7 +26,6 @@ public class MouseMotion extends MouseMotionAdapter switch (panel.getClickedOption()) { case "drag": - boolean collision = false; if (panel.getDragObject() != null) panel.getDragObject().setPosition(new Point2D.Double((panel.getDragObject().getPosition().getX()) - ((panel.getLastClickPosition().getX() - clickPoint.getX())) / panel.getDragObject().getScale(), (panel.getDragObject().getPosition().getY()) - (panel.getLastClickPosition().getY() - clickPoint.getY()) / panel.getDragObject().getScale())); panel.checkCollision(); @@ -87,14 +86,19 @@ public class MouseMotion extends MouseMotionAdapter panel.setLastClickPosition(clickPoint); panel.getPP().update(); } + + public void mouseMoved(MouseEvent e) { + if(panel.getClickedOption().equals("Path")) + panel.getCurrentPath().setTempPoint(panel.getClickPoint(e.getPoint())); + panel.repaint(); + } private void resizeBigger() { double scale = panel.getDragObject().getScale()*1 + 0.02; - panel.getDragObject().setScale(scale); panel.getDragObject().setPosition(new Point2D.Double(panel.getDragObject().getPosition().getX() -2, panel.getDragObject().getPosition().getY() - 2)); - + panel.checkCollision(); } private void resizeSmaller(Point2D clickPoint) @@ -105,7 +109,7 @@ public class MouseMotion extends MouseMotionAdapter double scale = panel.getDragObject().getScale()*1 - 0.02; panel.getDragObject().setScale(scale); panel.getDragObject().setPosition(new Point2D.Double(panel.getDragObject().getPosition().getX() +2, panel.getDragObject().getPosition().getY() +2 )); - + panel.checkCollision(); } } } diff --git a/Objects/OldPath.java b/Objects/OldPath.java new file mode 100644 index 0000000..eea51b7 --- /dev/null +++ b/Objects/OldPath.java @@ -0,0 +1,21 @@ +package Objects; + +import java.awt.geom.Point2D; + +import Applicatie.DrawObject; + +public class OldPath extends DrawObject +{ + + public OldPath(Point2D position) + { + super("images/path.jpg", position); + } + + @Override + public String getName() + { + return "Path"; + } + +} diff --git a/Objects/Path.java b/Objects/Path.java index 1cde2ff..b6e7da0 100644 --- a/Objects/Path.java +++ b/Objects/Path.java @@ -1,21 +1,117 @@ package Objects; +import java.awt.BasicStroke; +import java.awt.Graphics2D; +import java.awt.Shape; +import java.awt.TexturePaint; +import java.awt.geom.Line2D; import java.awt.geom.Point2D; +import java.awt.geom.Rectangle2D; +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; -import Applicatie.DrawObject; +import javax.imageio.ImageIO; -public class Path extends DrawObject -{ +/** + * Create's a path. + * @author Wesley de Hek + * @version 1.2 + */ +public class Path { - public Path(Point2D position) - { - super("images/path.jpg", position); + private ArrayList points; + private ArrayList lines; + private Point2D tempPoint; + private BufferedImage pathBackground; + + /** + * Constructor. + */ + public Path() { + points = new ArrayList<>(); + lines = new ArrayList<>(); + try { + pathBackground = ImageIO.read(new File("images/newPath.png")); + } catch (IOException e) { + e.printStackTrace(); + } } - - @Override - public String getName() - { - return "Path"; + + /** + * Draws the path. + * @param g2 - the Graphics2D object. + */ + public void draw(Graphics2D g2) { + TexturePaint paint = new TexturePaint(pathBackground,new Rectangle2D.Double(0,0,128,128)); + g2.setPaint(paint); + g2.setStroke(new BasicStroke(30,BasicStroke.CAP_ROUND,BasicStroke.JOIN_ROUND)); + if(!points.isEmpty()) { + for(int i = 1; i < points.size(); i++) { + Point2D previousPoint = points.get(i-1); + Point2D point = points.get(i); + g2.drawLine((int) previousPoint.getX(),(int) previousPoint.getY(),(int) point.getX(),(int) point.getY()); + } + //Drawing line that follows the mouse: + if(tempPoint != null) { + Point2D lastPoint = points.get(points.size()-1); + g2.drawLine((int) lastPoint.getX(),(int) lastPoint.getY(),(int) tempPoint.getX(),(int) tempPoint.getY()); + } + } } - -} + + /** + * Check if one of the lines contains the given point. + * @param point - the point you want to containment with. + * @return if the path contains the point. + */ + public boolean containsPoint(Point2D point) { + for(Shape line : getPath()) { + if(line.contains(point)) { + return true; + } + } + return false; + } + + /** + * Get array with line's from the points. + * @return a array with all the lines of the path. + */ + public ArrayList getPath() { + lines.clear(); + for(int i = 1; i < points.size(); i++) { + Point2D previousPoint = points.get(i-1); + Point2D point = points.get(i); + Line2D line = new Line2D.Double((int) previousPoint.getX(),(int) previousPoint.getY(),(int) point.getX(),(int) point.getY()); + BasicStroke stroke = new BasicStroke(30,BasicStroke.CAP_ROUND,BasicStroke.JOIN_ROUND); + lines.add(stroke.createStrokedShape(line)); + } + return lines; + } + + /** + * Add a point to the path. + * @param point - the point you want the path to pass. + */ + public void addPoint(Point2D point) { + points.add(point); + } + + /** + * Get all the path points. + * @return all the points of the path. + */ + public ArrayList getPoints() { + return points; + } + + /** + * Set the temporary point, useful for following the mouse while drawing the path. + * @param point - the point of the mouse. + */ + public void setTempPoint(Point2D point) { + tempPoint = point; + } +} \ No newline at end of file diff --git a/images/newPath.png b/images/newPath.png new file mode 100644 index 0000000000000000000000000000000000000000..fc29b0eb32dbf621fc82a9802f64d4859eff3a9b GIT binary patch literal 21189 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 literal 0 HcmV?d00001