0

So am trying to retrieve the coordinates of a line 2D that i will draw on my JPanel. The getBounds() method seemed to work for a rectangle2D but is not appripriate for a line2D.. How can i get the the coordinates of a line2D and put them in a variable as i did for the rectangle2D below: Here is my entire code!

import java.awt.AlphaComposite;
import java.awt.BasicStroke;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.RenderingHints;
import java.awt.Shape;
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 java.awt.geom.Ellipse2D;
import java.awt.geom.Line2D;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Scanner;

import javax.imageio.ImageIO;
import javax.swing.Box;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JColorChooser;
import javax.swing.JComponent;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JSeparator;
import javax.swing.JSlider;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.filechooser.FileNameExtensionFilter;

public class Test extends JFrame {
    private int len;

  // public int getSizes(){
 // return len;
//}

    private static final long serialVersionUID = -140274271716086522L;

    JMenuBar menubar;
    JMenu File, Exit;
    JMenuItem New, Open;
    JComponent DrawingBoard;

    JButton  lineBut, ellipseBut, rectBut, strokeBut;

    DecimalFormat dec = new DecimalFormat("#.##");

    // Contains all of the rules for drawing

    Graphics2D graphSettings;


    // Going to be used to monitor what shape to draw next

    int currentAction = 1;

    // Transparency of the shape

    // Default stroke and fill colors

    Color strokeColor = Color.BLACK;

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        // Define the defaults for the JFrame

        this.setSize(800, 600);
        this.setTitle("ERD BUILDER");
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setJMenuBar(menubar);

        JMenuBar menuBar = new JMenuBar();

        // Add the menubar to the frame
        setJMenuBar(menuBar);

        // Define and add two drop down menu to the menubar
        JMenu fileMenu = new JMenu("File");
        JMenu editMenu = new JMenu("Edit");
        JMenu dbMenu = new JMenu("Database");
        JMenu ToolsMenu = new JMenu("Tools");
        JMenu HelpMenu = new JMenu("Help");
        menuBar.add(fileMenu);
        menuBar.add(editMenu);
        menuBar.add(dbMenu);
        menuBar.add(ToolsMenu);
        menuBar.add(HelpMenu);
        // Create and add simple menu item to one of the drop down menu
        JMenuItem newAction = new JMenuItem("New Project");
        JMenuItem openAction = new JMenuItem("Open File");
        JMenuItem exitAction = new JMenuItem("Quit");
        JMenuItem cutAction = new JMenuItem("Cut");
        JMenuItem copyAction = new JMenuItem("Copy");
        JMenuItem pasteAction = new JMenuItem("Paste");
        JMenuItem UndoAction = new JMenuItem("Undo");
        JMenuItem RedoAction = new JMenuItem("Redo");
        JMenuItem clearAction = new JMenuItem("Clear");
        JMenuItem saveAction = new JMenuItem("Save");
        JMenuItem exportAction = new JMenuItem("Export");
        JMenuItem printAction = new JMenuItem("Print");
        JMenuItem ConvertAction = new JMenuItem("Convert To Tables");
        JMenuItem ColorAction = new JMenuItem("Color Picker");
        JMenuItem ZoomAction = new JMenuItem("Zoom");
        JMenuItem EntityAction = new JMenuItem("Entity & Attributes");
        JMenuItem RelationshipAction = new JMenuItem("Relationship Attributes");
        JMenuItem HelpAction = new JMenuItem("Help");
        JMenuItem AboutAction = new JMenuItem("About");

        fileMenu.add(newAction);
        fileMenu.addSeparator();
        fileMenu.add(openAction);
        fileMenu.addSeparator();
        fileMenu.add(saveAction);
        fileMenu.addSeparator();
        fileMenu.add(exportAction);
        fileMenu.addSeparator();
        fileMenu.add(printAction);
        fileMenu.addSeparator();
        fileMenu.add(exitAction);

        editMenu.add(UndoAction);
        editMenu.addSeparator();
        editMenu.add(RedoAction);
        editMenu.addSeparator();
        editMenu.add(cutAction);
        editMenu.addSeparator();
        editMenu.add(copyAction);
        editMenu.addSeparator();
        editMenu.add(pasteAction);
        editMenu.addSeparator();
        editMenu.add(clearAction);

        dbMenu.add(ConvertAction);

        ToolsMenu.add(ColorAction);
        ToolsMenu.addSeparator();
        ToolsMenu.add(ZoomAction);
        ToolsMenu.addSeparator();
        ToolsMenu.add(EntityAction);
        ToolsMenu.addSeparator();
        ToolsMenu.add(RelationshipAction);

        HelpMenu.add(HelpAction);
        HelpMenu.addSeparator();
        HelpMenu.add(AboutAction);


        exitAction.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {

        }}
        );






        ConvertAction.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {

               new ConvertForm().setVisible(true);



        }}
        );




        newAction.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {

                new Test().setVisible(true);
            }
        });



        JPanel buttonPanel = new JPanel();

        JPanel FieldPanel = new JPanel();

        // Swing box that will hold all the buttons

        Box theBox = Box.createVerticalBox();
        Box theBoxs = Box.createVerticalBox();

        // Make all the buttons in makeMeButtons by passing the
        // button icon.


        lineBut = makeMeButtons("./src/line.png", 2);
        ellipseBut = makeMeButtons("./src/ellipse.png", 3);
        rectBut = makeMeButtons("./src/rectangle.png", 4);

        // Make all the buttons in makeMeColorButton by passing the
        // button icon and true for stroke color or false for fill

        strokeBut = makeMeColorButton("./src/stroke.png", 5, true);


        // Add the fields to the boxs



        //theBox.add(brushBut);
        theBox.add(lineBut);
        theBox.add(ellipseBut);
        theBox.add(rectBut);
        theBox.add(strokeBut);

        buttonPanel.add(theBox);
        FieldPanel.add(theBoxs);


        this.add(buttonPanel, BorderLayout.WEST);
        this.add(FieldPanel, BorderLayout.EAST);
        buttonPanel.setPreferredSize(new Dimension(200,480));        
        FieldPanel.setPreferredSize(new Dimension(200,480));
        // Make the drawing area take up the rest of the frame

        // this.add(new DrawingBoard(), BorderLayout.CENTER);
        final DrawingBoard drawPanel = new DrawingBoard();
        this.add(drawPanel, BorderLayout.CENTER);
        this.getContentPane().setBackground(Color.WHITE);






        exportAction.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent arg0) {
                BufferedImage image = new BufferedImage(drawPanel.getWidth(),
                        drawPanel.getHeight(), BufferedImage.TYPE_INT_ARGB);
                Graphics2D g = image.createGraphics();
                drawPanel.paint(g);
                g.dispose();

                JFileChooser fileChooser = new JFileChooser();
                File theDirectory = new File("C:/Users/Wenda/Desktop");
                fileChooser.setCurrentDirectory(theDirectory);
                FileNameExtensionFilter pngFilter = new FileNameExtensionFilter(
                        "PNG file (*.png)", "png");
                fileChooser.addChoosableFileFilter(pngFilter);
                fileChooser.setFileFilter(pngFilter);

                int status = fileChooser.showSaveDialog(Test.this);

                if (status == JFileChooser.APPROVE_OPTION) {
                    try {
                        ImageIO.write(image, "png",
                                fileChooser.getSelectedFile());
                        JOptionPane.showMessageDialog(null, "Image saved to "
                                + fileChooser.getSelectedFile().getName());
                    } catch (Exception ex) {
                        ex.printStackTrace();
                    }
                }
            }
        });
        // Show the frame
        this.setVisible(true);
    }

    public JButton makeMeButtons(String iconFile, final int actionNum) {
        JButton theBut = new JButton();
        Icon butIcon = new ImageIcon(iconFile);
        theBut.setIcon(butIcon);

         theBut.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                currentAction = actionNum;
            }
        });
        return theBut;
    }

    // Spits out buttons based on the image supplied and
    // whether a stroke or fill is to be defined

    public JButton makeMeColorButton(String iconFile, final int actionNum,
            final boolean stroke) {
        JButton theBut = new JButton();
        Icon butIcon = new ImageIcon(iconFile);
        theBut.setIcon(butIcon);

        theBut.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {

                if (stroke) {

                    // JColorChooser is a popup that lets you pick a color

                    strokeColor = JColorChooser.showDialog(null,
                            "Pick a Stroke", Color.BLACK);
                } else {
                                    }
            }
        });

        return theBut;
    }
    public class DrawingBoard extends JComponent {

        private static final long serialVersionUID = -4431176095451940075L;

        // ArrayLists that contain each shape drawn along with
        // that shapes stroke and fill
        ArrayList<Shape> shapes = new ArrayList<Shape>();
        ArrayList<Color> shapeStroke = new ArrayList<Color>();
        ArrayList<Integer> count = new ArrayList<Integer>();


        Point drawStart, drawEnd;
        // Monitors events on the drawing area of the frame

        public DrawingBoard() {


            this.addMouseListener(new MouseAdapter() {

                public void mousePressed(MouseEvent e) {

                    if (currentAction != 1) {

                        // When the mouse is pressed get x & y position

                        drawStart = new Point(e.getX(), e.getY());
                        drawEnd = drawStart;
                         repaint();
                    }
                }

                public void mouseReleased(MouseEvent e) {
                    int counts =0;
                    if (currentAction != 1) {
                        Shape aShape = null;

                        if (currentAction == 2) {
                            aShape = drawLine(drawStart.x, drawStart.y,
                            e.getX(), e.getY());
                            shapes.add(aShape);
                            int var = shapes.size();
                         System.out.println("Array index"+var);







                            shapeStroke.add(strokeColor);
                            drawStart = null;
                            drawEnd = null;
                            repaint();
                        } else

                        if (currentAction == 4) {
                            boolean collision = false;

                            // Create a new rectangle using x & y coordinates 
                            aShape = drawRectangle(drawStart.x, drawStart.y,
                            e.getX(), e.getY());                            
                            shapes.add(aShape);     


                            //returns the coordinates of each rectangle
                            //System.out.println(aShape);
                         int var = shapes.size();
                         System.out.println("Array index"+var);
                         if(var>1){

                             //look for collisions between shapes
                            for(int i=0;i<var-1;i++){ 
                            Shape st = shapes.get(var-1);
                            Shape s = shapes.get(i);
                          double x = (s.getBounds2D().getX());
                          double y = (s.getBounds2D().getY());
                          double w = (s.getBounds2D().getWidth());
                           double h = (s.getBounds2D().getHeight());


                           Line2D.Float l = (Line2D.Float)s;
                           double x1 = (l.getX1());
                           double y1 = (l.getY1());
                           double x2 = (l.getX2());
                           double y2 = (l.getY2());
                           System.out.println(x1+" , "+x2+" , "+y1+" , "+y2);


                            if(st.intersects(x+7, y+7, w+7, h+7)){
                                collision = true;
                                System.out.println("it collides with "+i);

                            }
                            else{
                                collision = false;
                                System.out.println("NO COLLISION with " +i);

                            }

                        }    
                         }

                            shapeStroke.add(strokeColor);
                            drawStart = null;
                            drawEnd = null;
                            repaint();


                            //new EntityForm().setVisible(true);

                    }             

                    }

                }
            });

              this.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent me) {
                JTextField name = new JTextField(15);
                super.mouseClicked(me);
                for (Shape s : shapes) {

                    if (s.contains(me.getPoint())) {//check if mouse is clicked within shape
                        //we can either just print out the object class name
                        System.out.println("Clicked a "+s.getClass().getName());

                        //or check the shape class we are dealing with using instance of with nested if
                        if (s instanceof Rectangle2D) {

                            //create table  

                        } 
                         else if (s instanceof Ellipse2D) {






                        }

                    }
                }
            }
        });



            this.addMouseMotionListener(new MouseMotionAdapter() {

                public void mouseDragged(MouseEvent e) {

                    // If this is a brush have shapes go on the screen quickly

                    if (currentAction == 1) {

                        int x = e.getX();
                        int y = e.getY();

                        Shape aShape = null;
                        shapes.add(aShape);

                        shapeStroke.add(strokeColor);

                        // Add the transparency value
                    }

                    // Get the final x & y position after the mouse is dragged

                    drawEnd = new Point(e.getX(), e.getY());
                    repaint();
                }
            });
        }

        public void paint(Graphics g) {
            // Class used to define the shapes to be drawn

            graphSettings = (Graphics2D) g;

            // Antialiasing cleans up the jagged lines and defines rendering
            // rules

            graphSettings.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                    RenderingHints.VALUE_ANTIALIAS_ON);

            // Defines the line width of the stroke

            graphSettings.setStroke(new BasicStroke(4));

            // Iterators created to cycle through strokes and fills
            Iterator<Color> strokeCounter = shapeStroke.iterator();
            for (Shape s : shapes) {

                // Grabs the next stroke from the color arraylist
                graphSettings.setPaint(strokeCounter.next());

                graphSettings.draw(s);

            }

            // Guide shape used for drawing
            if (drawStart != null && drawEnd != null) {
                // Makes the guide shape transparent

                graphSettings.setComposite(AlphaComposite.getInstance(
                        AlphaComposite.SRC_OVER, 0.40f));

                // Make guide shape gray for professional look

                graphSettings.setPaint(Color.LIGHT_GRAY);

                Shape aShape = null;

                if (currentAction == 2) {
                    aShape = drawLine(drawStart.x, drawStart.y, drawEnd.x,
                            drawEnd.y);
                } else

               if (currentAction == 4) {

                    aShape = drawRectangle(drawStart.x, drawStart.y, drawEnd.x,
                            drawEnd.y);



                }

                graphSettings.draw(aShape);
            }
        }


        private Rectangle2D.Float drawRectangle(int x1, int y1, int x2, int y2) {
            // Get the top left hand corner for the shape
            // Math.min returns the points closest to 0

            int x = Math.min(x1, x2);
            int y = Math.min(y1, y2);

            // Gets the difference between the coordinates and

            int width = Math.abs(x1 - x2);
            int height = Math.abs(y1 - y2);

            return new Rectangle2D.Float(x, y, width, height);



        }

         private Line2D.Float drawLine(int x1, int y1, int x2, int y2) {

            return new Line2D.Float(x1, y1, x2, y2);
        }
           }

    }
Lana
  • 171
  • 1
  • 7
  • 18

3 Answers3

1

Use the pathIterator to traverse the shape and obtain the line segments that makes your shapes and its vertex.

final float[] coords = new float[n];
while (!iterator.isDone()) {
    iterator.currentSegment(coords );
    float x = coords [0];
    float y = coords [1];
    // TODO your stuff
    iterator.next();
}
Paco Abato
  • 3,920
  • 4
  • 31
  • 54
0

you can use

 getX1();
 getX2();

and

 getY1()
 getY2()

for getting x1,y1 and x2,y2 coordinates .there is no width and height for a 2d line.read api here

update

assume u have a line 2d shape

Shape s = new Line2D.Float(1, 2, 200, 200);

now you if want to get (x1,y1,x2,y2)then use

Shape s = new Line2D.Float(1, 2, 200, 200);
Line2D.Float l1 = (Line2D.Float) s;
double x1 = (l1.getX1());
double y1 = (l1.getY1());
double x2 = (l1.getX2());
double y2 = (l1.getY2());
System.out.println(x1+" , "+x2+" , "+y1+" , "+y2);
Madhawa Priyashantha
  • 9,633
  • 7
  • 33
  • 60
  • I've edited the code above but the getX1() and others getters are underlined red! – Lana Mar 02 '15 at 12:25
  • Thank you so much for responding, but the getX1() etc what should i put in there because when i put it like you suggested, the getY1(), getY2(), getX1(), getX2() are still underlined. what should be inside that getX1? – Lana Mar 02 '15 at 12:49
  • @LanaM getBounds2D() doesn't have getX1() you need to cast shape to Line2D.Float first then you can get x1,x2 like in my code.if you can postyour complete code anywhere like pastebin then i can check it – Madhawa Priyashantha Mar 02 '15 at 12:52
  • Ok, Thank you, i will post it here itself. I'll edit the code above. Thank you so much. – Lana Mar 02 '15 at 12:55
  • im trying to determine the coordinates of the lines or any other objects because i need to know if they intersects or are linked. And if they are linked with what they are linked. – Lana Mar 02 '15 at 13:02
  • @LanaM why do you say getBounds2D() methods doesn'twork? – Madhawa Priyashantha Mar 02 '15 at 13:14
  • i can't put the getBounds2D().getX1() that doesn't work – Lana Mar 02 '15 at 13:19
  • This is for the rectangle2D. What am doing was, to get the coordinates of the rectangles. All the rectangles are stored inside an array "shape" and when the array.size() > 1 then it goes through the FOR LOOP to see if the new shape collides with other shapes found inside the array. That's for the rectangle2D. Am trying to get the same result for the line2D, please see the "Current Action==2" for the line2D – Lana Mar 02 '15 at 13:27
  • @LanaM if you want to detect intersection of 2 lines then plz see this question and answer http://stackoverflow.com/questions/16333650/how-to-check-whether-2-lines-segments-intersect – Madhawa Priyashantha Mar 02 '15 at 13:31
  • i want to detect line to rectangle collision. do you know how i can do that? – Lana Mar 02 '15 at 13:35
  • @LanaM plz read this one http://stackoverflow.com/questions/15514906/how-to-check-intersection-between-a-line-and-a-rectangle – Madhawa Priyashantha Mar 02 '15 at 13:37
  • I've edited my code above. sorry i've messed up a little bit while editing my own codes and i've sent you a non working code. Please see the updated code with your modification. the line "Line2D.Float l = (Line2D.Float)s;" is giving me errors but if you remove your codes from mine, you can run the program and see what im trying to achieve. Thank you for your precious time. Can you please take a look? – Lana Mar 02 '15 at 14:09
0

implement the mouseListener interface with your class, and override the mouseClicked(), like this,

//define x,y as class members
int x=0;
int y=0;
public void mouseClicked(MouseEvent me){
   x=me.getX();
   y=me.getY();
   System.out.println("x:"+x+"Y:"+y);
}

click on Line shape presented in your JPanel, on clcking on the JPanel with your mouse button, the coordinates will be displayed on your console.

Balayesu Chilakalapudi
  • 1,386
  • 3
  • 19
  • 43