2013-03-25 2 views
1

나는 지시선을 만들어서 움직이기를 원합니다. 내가 선을 이동하는 동안은 난민 얻을 감독이 라인을 만들어 줄하지만 화살표를 이동 할 수 있어요자바가 지시선을 만들고 움직이게하십시오

이 내 페인트 방법

Line2D.Double line = new Line2D.Double(startX, startY, endX, endY); 
        g2d.draw(line); 
        tx.setToIdentity();      
        double angle = Math.atan2(line.y2 - line.y1, line.x2 - line.x1); 
        tx.translate(line.x2, line.y2); 
        tx.rotate((angle - Math.PI/2d)); 
        Graphics2D gClone = (Graphics2D) g2d.create(); 
        gClone.setTransform(tx); 
Polygon arrowHead = new Polygon(); 
     arrowHead.addPoint(0, 15); 
     arrowHead.addPoint(-15, -15); 
     arrowHead.addPoint(15, -15); 
        Area area = new Arear(arrowHead); 
        Area lineArea = new Area(line); 
        lineArea.subtract(area); 
        gClone.fill(area); 
        gClone.dispose(); 

내가 startx로의 값을 변경할 수 있고 y에 시작 마우스 사용자 정의 모양을 정의하기 위해, 마우스 드래그

+0

당신이 선을 그릴 때 동시에 화살표를 그리기 시도 (마우스)을 향해 선을 가리 킵니다 있도록

화살표는 지향한다? – Patashu

+0

일반 직선 모양으로 선과 화살표를 그린 다음 전체 모양 (선 + 화살 머리)으로 번역을 적용하십시오 – MadProgrammer

+0

@MadProgrammer 어떻게 수행 할 것입니까 – Complicated

답변

5

이것은 Path2D의 사용을 보여줍니다 기본 예제에서 및 endx 및 enny을 pressedd과 AffineTransformation는 모양을 변형 할 수 있습니다. 이 패널을 통해 두

기본적으로 예와

enter image description here

import java.awt.BasicStroke; 
import java.awt.BorderLayout; 
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.Rectangle; 
import java.awt.Shape; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import java.awt.geom.AffineTransform; 
import java.awt.geom.Path2D; 
import javax.swing.JFrame; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class RotateArrow { 

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

    public RotateArrow() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setLayout(new BorderLayout()); 
       frame.add(new RotatePane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class RotatePane extends javax.swing.JPanel { 

     private Point mousePoint; 
     private PointyThing pointyThing; 

     public RotatePane() { 

      pointyThing = new PointyThing(); 

      addMouseMotionListener(new MouseAdapter() { 
       @Override 
       public void mouseMoved(MouseEvent e) { 
        mousePoint = e.getPoint(); 
        repaint(); 
       } 
      }); 

     } 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(200, 200); 
     } 

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 

      Graphics2D g2d = (Graphics2D) g.create(); 

      double rotation = 0f; 

      int width = getWidth() - 1; 
      int height = getHeight() - 1; 

      if (mousePoint != null) { 
       int x = width/2; 
       int y = height/2; 

       int deltaX = mousePoint.x - x; 
       int deltaY = mousePoint.y - y; 

       rotation = -Math.atan2(deltaX, deltaY); 
       rotation = Math.toDegrees(rotation) + 180; 
      } 

      Rectangle bounds = pointyThing.getBounds(); 

      AffineTransform at = new AffineTransform(); 
      at.translate((width - bounds.width)/2, (height - bounds.height)/2); 
      at.rotate(Math.toRadians(rotation), bounds.width/2, bounds.height/2); 
      Shape shape = new Path2D.Float(pointyThing, at); 

      g2d.setStroke(new BasicStroke(3)); 
      g2d.setColor(Color.RED); 

      g2d.fill(shape); 
      g2d.draw(shape); 
      g2d.dispose(); 
     } 
    } 

    public class PointyThing extends Path2D.Float { 

     public PointyThing() { 
      moveTo(15, 0); 
      lineTo(30, 15); 
      lineTo(0, 15); 
      lineTo(15, 0); 
      moveTo(15, 15); 
      lineTo(15, 60); 
     } 

    } 
} 

업데이트를 이동할 때

이 예는 마우스를 향해 가리 키도록 화살표의 원인이됩니다, 이것은 PointyThing 등을 사용 화살촉 만, 그리고 선을 따로 따로 그립니다. 이

import java.awt.BasicStroke; 
import java.awt.BorderLayout; 
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.Rectangle; 
import java.awt.Shape; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import java.awt.geom.AffineTransform; 
import java.awt.geom.Line2D; 
import java.awt.geom.Path2D; 
import javax.swing.JFrame; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class RotateArrow { 

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

    public RotateArrow() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setLayout(new BorderLayout()); 
       frame.add(new RotatePane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 

     }); 
    } 

    public class RotatePane extends javax.swing.JPanel { 

     private PointyThing pointyThing; 
     private Point mouseStart; 
     private Point mouseEnd; 

     public RotatePane() { 

      pointyThing = new PointyThing(); 

      MouseAdapter ma = new MouseAdapter() { 
       @Override 
       public void mouseMoved(MouseEvent e) { 
        mouseEnd = e.getPoint(); 
        repaint(); 
       } 

       @Override 
       public void mouseClicked(MouseEvent e) { 
        mouseStart = e.getPoint(); 
        repaint(); 
       } 
      }; 

      addMouseListener(ma); 
      addMouseMotionListener(ma); 

     } 

     @Override 
     public Dimension getPreferredSize() { 

      return new Dimension(200, 200); 

     } 

     @Override 
     protected void paintComponent(Graphics g) { 

      super.paintComponent(g); 

      Graphics2D g2d = (Graphics2D) g.create(); 
      if (mouseStart != null && mouseEnd != null) { 

       double rotation = 0f; 

       int width = getWidth() - 1; 
       int height = getHeight() - 1; 

       if (mouseEnd != null) { 

        int x = mouseStart.x; 
        int y = mouseStart.y; 

        int deltaX = mouseEnd.x - x; 
        int deltaY = mouseEnd.y - y; 

        rotation = -Math.atan2(deltaX, deltaY); 
        rotation = Math.toDegrees(rotation) + 180; 

       } 

       Rectangle bounds = pointyThing.getBounds(); 

       g2d.setStroke(new BasicStroke(3)); 
       g2d.setColor(Color.RED); 
       g2d.draw(new Line2D.Float(mouseStart, mouseEnd)); 

       AffineTransform at = new AffineTransform(); 

       at.translate(mouseEnd.x - (bounds.width/2), mouseEnd.y - (bounds.height/2)); 
       at.rotate(Math.toRadians(rotation), bounds.width/2, bounds.height/2); 
       Shape shape = new Path2D.Float(pointyThing, at); 

       g2d.fill(shape); 
       g2d.draw(shape); 
      } 
      g2d.dispose(); 

     } 

    } 

    public class PointyThing extends Path2D.Float { 

     public PointyThing() { 
      moveTo(15, 0); 
      lineTo(30, 15); 
      lineTo(0, 15); 
      lineTo(15, 0); 
     } 

    } 

} 
+0

ur 진정한 천재이며 저는이 질문에 대답했기 때문에 그 말을하지 않습니다. .. 내가 어떤 일에 부딪 치고 열심히 시도하지만 열심히 시도 할 때가 여러 번있다. 스택에 대한 해결책이 있고 시간의 절반 이상이 ...에 의해 답변된다. 여러면에서 나를 도왔다. . 고마워.........이 일을 내 작품에 적용한 다음 결과를 알려주겠다. 하지만 프로그래밍에 초보자이지만 나는 같은 사람이되고 싶다. ... – Complicated

+1

나는 네가 나보다 나아 지길 바래;) – MadProgrammer

+0

만약 x와 y가 있다면 어떻게이 PointyThing을 만들 수 있을까요? ?? 노력했지만 반전 된 L이되었습니다 – Complicated