2015-03-02 2 views
0

Так что я пытаюсь получить координаты строки 2D, которую я нарисую на моем JPanel. Метод getBounds(), казалось, работал для rectangle2D, но не является appripriate для line2D.. Как я могу получить координаты строки2D и поместить их в переменную, как я сделал для прямоугольника2D ниже: Вот мой весь код!Как получить координаты Line2D в Java

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

    } 

ответ

0

вы можете использовать

getX1(); 
getX2(); 

и

getY1() 
getY2() 

для получения x1,y1 и x2,y2 координаты .there не ширина и высота для 2d line.read api здесь

обновление

Предположим, у вас линия 2d форма

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

Я редактировал код выше, но getX1() и другие геттеры подчеркнуты красным! – Lana

+0

@LanaM plz проверить обновленный один вы имели в виду 'Line2D.Double' –

+0

Большое вам спасибо за ответ, но getX1() и т. Д., Что я должен был там положить, потому что, когда я так выразился, getY1(), getY2(), getX1(), getX2() все еще подчеркнуты. что должно быть внутри этого getX1? – Lana

0

реализуют интерфейс 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, на clcking на JPanel с кнопкой мыши, координаты будут отображаться на консоли.

+0

Я изменил getX() на getX1(), поскольку я ищу координаты x1, y1, x2, y2 строки2D. но getX1() не годится! Любые другие предложения? – Lana

+0

, но это для координат линии 2D? – Lana

+0

Это работает, я определяю координаты формы JPanel с помощью этой техники. –

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

Я никогда не использовал его, у вас есть образец кода, который поможет мне? – Lana

+0

Я добавил пример к моему ответу. –

+0

Благодарим вас за ответ, нет ли других способов, кроме PathIterator? – Lana

Смежные вопросы