그래서 선을 클릭하고 드래그하려고합니다. 나는 거의 다 왔지만 사용자가 드래그하는 위치와 관련하여 선의 위치를 계산하는 데 문제가 있다고 생각합니다. 클릭하고 끌면 은으로 이동합니다. 이 코드에 문제가 있다고 생각합니다.JPanel에서 Line2D를 드래그하여 끌기
어떻게 작동시킬 수 있습니까? 드래그에 대한
MCVE
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Cursor;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Panel;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.geom.Line2D;
import java.awt.geom.Point2D;
import java.awt.geom.Rectangle2D;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JFrame;
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 UMLWindow2();
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 UMLWindow2 extends JFrame {
Shapes shapeList = new Shapes();
Panel panel;
private static final long serialVersionUID = 1L;
public UMLWindow2() {
addMenus();
panel = new Panel();
}
public void addMenus() {
getContentPane().add(shapeList);
setSize(300, 200);
setLocationRelativeTo(null);
setDefaultCloseOperation(EXIT_ON_CLOSE);
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<Line2D.Double> lines = new ArrayList<Line2D.Double>();
private Line2D.Double linePath;
double phi = Math.toRadians(40);
int barb = 20;
Boolean hovering = false;
Boolean resizing = false;
public Shapes() {
MyMouseAdapter myMouseAdapter = new MyMouseAdapter();
addMouseListener(myMouseAdapter);
addMouseMotionListener(myMouseAdapter);
}
public void addLine() {
linePath = new Line2D.Double(300, 300, 500, 500);
lines.add(linePath);
repaint();
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
g2.setStroke(new BasicStroke(2));
for (Line2D line : lines) {
g2.setColor(Color.BLACK);
Point sw = new Point((int) line.getX1(), (int) line.getY1());
Point ne = new Point((int) line.getX2(), (int) line.getY2());
g2.draw(line);
drawArrowHead(g2, ne, sw, Color.BLACK);
}
}
private void drawArrowHead(Graphics2D g2, Point tip, Point tail,
Color color) {
g2.setPaint(color);
double dy = tip.y - tail.y;
double dx = tip.x - tail.x;
double theta = Math.atan2(dy, dx);
double x, y, rho = theta + phi;
for (int j = 0; j < 2; j++) {
x = tip.x - barb * Math.cos(rho);
y = tip.y - barb * Math.sin(rho);
g2.draw(new Line2D.Double(tip.x, tip.y, x, y));
rho = theta - phi;
}
}
class MyMouseAdapter extends MouseAdapter {
int currentIndex;
Point2D.Double startPoint = new Point2D.Double();
Point2D.Double endPoint = new Point2D.Double();
@Override
public void mousePressed(MouseEvent e) {
Point p = e.getPoint();
if (hovering) {
System.out.println("Starting to resize");
startPoint.x = p.x;
startPoint.y = p.y;
resizing = true;
}
}
@Override
public void mouseDragged(MouseEvent e) {
Point p = e.getPoint();
if (resizing) {
endPoint.x = p.x;
endPoint.y = p.y;
double offsetX = endPoint.x - startPoint.x;
double offsetY = endPoint.y - startPoint.y;
System.out.println("Point 1: "
+ lines.get(currentIndex).getX1() + ", "
+ lines.get(currentIndex).getY1() + " Point 2: "
+ lines.get(currentIndex).getX2() + ", "
+ lines.get(currentIndex).getY2());
int newX1 = (int) (lines.get(currentIndex).getX1() + offsetX);
int newX2 = (int) (lines.get(currentIndex).getX2() + offsetX);
int newY1 = (int) (lines.get(currentIndex).getY1() + offsetY);
int newY2 = (int) (lines.get(currentIndex).getY2() + offsetY);
lines.get(currentIndex).setLine(newX1, newY1, newX2, newY2);
repaint();
}
}
@Override
public void mouseReleased(MouseEvent e) {
if (resizing) {
System.out.println("Done resizing");
resizing = false;
}
}
@Override
public void mouseMoved(MouseEvent e) {
Point p = e.getPoint();
Rectangle2D.Double rect = new Rectangle2D.Double(p.x - 1,
p.y - 1, 3, 3);
for (int i = 0; i < lines.size(); i++) {
Line2D line = lines.get(i);
if (line.intersects(rect)) {
setCursor(new Cursor(Cursor.HAND_CURSOR));
currentIndex = i;
hovering = true;
} else {
setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
hovering = false;
}
}
}
}
}
}
실제로 이미 둘러싸인 도형을 드래그 구현 방법이있다. 하지만 선에 문제가 있습니다. 그럼에도 불구하고 코드를 확인하고 내가 사용할 수있는 것을 확인하겠습니다. 대답을 많이 주셔서 고맙습니다. – Harry
@Harry, '클릭하고 끌면 아무 것도 끌 수없는 방식으로 움직입니다.' 두 줄의 교차 부분에 마우스를 가져 가면 커서가 "손"으로 바뀌는 것을 볼 수 있지만 아무 것도 움직일 수 없습니다. 게시 된 코드가 컴파일되지 않았습니다. 'new Editor()'를'new EditorDrag()'로 변경해야했습니다. – camickr
그건 내가 바보 같아서 잘못된 코드를 게시했기 때문입니다. 그것을 지적 주셔서 감사합니다. 업데이트 된 코드를 확인하면 올바르게 드래그되지 않는 것을 볼 수 있습니다 (그러나 드래그 앤 컴파일 ... lol) – Harry