Java创建一条有向线并使其移动
我想制作一条直线并让它移动。 我可以制作一条有向直线并移动直线,但是当我移动直线时箭头会移位
这是我的绘画方法
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的值并在鼠标按下和endx处开始y并且在鼠标拖动时启动了enny
这是演示使用Path2D
定义自定义形状和使用AffineTransformation
转换形状的基本示例。
此示例将使箭头在面板上移动时指向鼠标
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); } } }
- 在try / finally外部或内部初始化一次性资源
- java中的Unix时间戳创建
- javax.el.PropertyNotFoundException:/demo.xhtml @ 24,55 value =“#{UserBean.favYear3}”:目标无法访问,标识符’UserBean’已解析为null
- TokenResponseException:尝试访问Admin SDK Google API时出现401 Unauthorized Exception。
- 创建名为’entityManagerFactory’的bean时出错调用init方法失败
- 如何从Spring MVC控制器返回错误状态和validation错误?
- 如何使用Log4J屏蔽日志文件中的信用卡号?
- 将证书添加到Java信任库和Sslhandshake
- 如何在java中对属性进行排序?