【问题标题】:How to retrieve the coordinates of a Line2D in Java如何在 Java 中检索 Line2D 的坐标
【发布时间】:2015-03-02 12:15:48
【问题描述】:

所以我试图检索我将在我的 JPanel 上绘制的二维线的坐标。 getBounds() 方法似乎适用于rectangle2D,但不适用于line2D.。我如何获取 line2D 的坐标并将它们放入变量中,就像我对下面的 rectangle2D 所做的那样:这是我的整个代码!

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);
        }
           }

    }

【问题讨论】:

    标签: java line coordinates shape rectangles


    【解决方案1】:

    使用pathIterator 遍历形状并获取构成形状及其顶点的线段。

    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();
    }
    

    【讨论】:

    • 我没用过,有没有示例代码可以帮帮我?
    • 我在答案中添加了一个示例。
    • 谢谢你的回复,除了PathIterator没有别的办法了吗?
    【解决方案2】:

    你可以使用

     getX1();
     getX2();
    

     getY1()
     getY2()
    

    用于获取x1,y1x2,y2 坐标。二维线没有宽度和高度。在此处阅读api

    更新

    假设你有一个二维的形状

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

    现在你如果想得到(x1,y1,x2,y2)然后使用

    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);
    

    【讨论】:

    • 我已经编辑了上面的代码,但是 getX1() 和其他 getter 带有红色下划线!
    • 非常感谢您的回复,但是 getX1() 等我应该放在那里,因为当我按照您的建议放置时,getY1()、getY2()、getX1()、getX2 () 仍然加下划线。 getX1 里面应该有什么?
    • @LanaM getBounds2D() 没有 getX1() 你需要先将形状转换为 Line2D.Float 然后你可以像我的代码一样获得 x1,x2。如果你可以在任何地方发布你的完整代码pastebin 然后我可以检查它
    • 好的,谢谢,我会自己贴在这里。我将编辑上面的代码。非常感谢。
    • 我试图确定线条或任何其他对象的坐标,因为我需要知道它们是否相交或链接。如果它们与所链接的内容相关联。
    【解决方案3】:

    用你的类实现 mouseListener 接口,并像这样覆盖 mouseClicked(),

    //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);
    }
    

    点击 JPanel 中显示的线条形状,用鼠标单击 JPanel 时,坐标将显示在控制台上。

    【讨论】:

    • 我已经通过 getX1() 更改了 getX(),因为我正在寻找 line2D 的 x1,y1,x2,y2 坐标。但 getX1() 不好!还有其他建议吗?
    • 但这是否适用于 line2D 坐标?
    • 它有效,我正在用这种技术确定 JPanel 的形状坐标。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-27
    • 2020-08-31
    • 1970-01-01
    相关资源
    最近更新 更多