gpt4 book ai didi

java - 在 JPanel 中单击并拖动 Path2D 线

转载 作者:行者123 更新时间:2023-12-01 12:23:46 26 4
gpt4 key购买 nike

所以,我使用 Path2D 画一条线并执行以下操作:

Path2D linePath = new Path2D.Double();
linePath.moveTo(startingX, startingY);
linePath.lineTo(endingX, endingY);
repaint();

我想做的是点击并拖动线条。目前,我不想更改线条的结构(长度等),我只想移动线条。我知道您可以使用 Path2D.contains(e.getPoint) 来表示封闭的形状,但这不适用于线条。有任何想法吗?谢谢

完整代码

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Panel;
import java.awt.Point;
import java.awt.RenderingHints;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.geom.Path2D;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JFrame;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Editor {

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

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

JFrame frame = new UMLWindow();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setBounds(30, 30, 1000, 700);
frame.getContentPane().setBackground(Color.white);
frame.setVisible(true);
frame.setLocationRelativeTo(null);
}
});
}

public static class UMLWindow extends JFrame {

Shapes shapeList = new Shapes();
Panel panel;

private static final long serialVersionUID = 1L;

public UMLWindow() {
addMenus();
panel = new Panel();
}

public void addMenus() {

getContentPane().add(shapeList);

setSize(300, 200);
setLocationRelativeTo(null);
setDefaultCloseOperation(EXIT_ON_CLOSE);

JMenuItem lineMenuItem = new JMenuItem("New Line");
lineMenuItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
System.out.println("adding line");
shapeList.addLine();
}
});

JMenuBar menubar = new JMenuBar();

menubar.add(lineMenuItem);

setJMenuBar(menubar);

// shapeList.addLine();
}
}

// Shapes class, used to draw the shapes on the panel
// as well as implements the MouseListener for dragging
public static class Shapes extends JPanel {

private static final long serialVersionUID = 1L;

private List<Path2D> lines = new ArrayList<Path2D>();
private Boolean drawing = false;
private Point lineStartingPoint = new Point();
private Point lineEndingPoint = new Point();
private Path2D.Double linePath;

public Shapes() {
MyMouseAdapter myMouseAdapter = new MyMouseAdapter();
addMouseListener(myMouseAdapter);
addMouseMotionListener(myMouseAdapter);
}

public void addLine() {
drawing = true;
repaint();
}

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

Graphics2D g2 = (Graphics2D) g;
g2.setStroke(new BasicStroke(2));
if (drawing) {
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
g2.setStroke(new BasicStroke(2));
g2.drawLine(lineStartingPoint.x, lineStartingPoint.y,
lineEndingPoint.x, lineEndingPoint.y);
}
for (Path2D shape : lines) {
g2.setColor(Color.BLACK);
g2.draw(shape);
}
}

class MyMouseAdapter extends MouseAdapter {

@Override
public void mousePressed(MouseEvent e) {
if (drawing) {
lineStartingPoint = e.getPoint();
lineEndingPoint = lineStartingPoint;
}
}

@Override
public void mouseDragged(MouseEvent e) {
if (drawing) {
lineEndingPoint = e.getPoint();
repaint();
System.out.println(lines.size());
}
}

@Override
public void mouseReleased(MouseEvent e) {
if (drawing) {
drawLine(e);
drawing = false;
}
}

public void drawLine(MouseEvent e) {
drawing = false;
lineEndingPoint = e.getPoint();
linePath = new Path2D.Double();
linePath.moveTo(lineStartingPoint.getX(),
lineStartingPoint.getY());
linePath.lineTo(lineEndingPoint.getX(), lineEndingPoint.getY());
lines.add(linePath);
repaint();
}

}
}
}

最佳答案

您可以使用BasicStroke

public Shape createStrokedShape(Shape s)

定义线条的粗细,传递您的Path2D并获取路径的轮廓。检查轮廓是否包含鼠标位置。如果它包含,您的鼠标位于 Path2D 上,您可以拖动形状。

关于java - 在 JPanel 中单击并拖动 Path2D 线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26499201/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com