gpt4 book ai didi

java - 当用户单击并拖动时调整 Path2D 形状的大小

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:02:56 24 4
gpt4 key购买 nike

因此,我有一个程序可以向 JPanel 添加一个正方形,并允许用户在面板周围拖动该形状。我想要做的是能够单击形状的右下角并在用户拖动时调整它的大小。我有点不知道如何做到这一点。我知道当用户拖动时,它需要重新计算矩形的长度和宽度以使右下角与鼠标所在的位置匹配。但是我怎样才能检测到矩形右下角的点击呢?感谢您的帮助。

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Panel;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.geom.AffineTransform;
import java.awt.geom.Path2D;
import java.io.File;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class UMLEditor {

public static void main(String[] args) {

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);
frame.setVisible(true);
}
}

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

setTitle("UML Editior");
setSize(300, 200);
setLocationRelativeTo(null);
setDefaultCloseOperation(EXIT_ON_CLOSE);

shapeList.addSquare(100, 100);
}

public void loadFile() {
JFileChooser chooser = new JFileChooser();
chooser.setCurrentDirectory(new File("."));

int r = chooser.showOpenDialog(this);
if (r == JFileChooser.APPROVE_OPTION) {
}
}
}

// Shapes class, used to draw the shapes on the panel
// as well as implements the MouseListener for dragging
class Shapes extends JPanel {
private static final long serialVersionUID = 1L;

private List<Path2D> shapes = new ArrayList<Path2D>();
int currentIndex;

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

public void addSquare(int width, int height) {
Path2D rect2 = new Path2D.Double();
rect2.append(new Rectangle(getWidth() / 2 - width / 2, getHeight() / 2
- height / 2, width, height), true);

shapes.add(rect2);
repaint();
}

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

Graphics2D g2 = (Graphics2D) g;
g2.setStroke(new BasicStroke(2));
for (Path2D shape : shapes) {
g2.draw(shape);
}
}

class MyMouseAdapter extends MouseAdapter {
private boolean pressed = false;
private Point point;

@Override
public void mousePressed(MouseEvent e) {
if (e.getButton() != MouseEvent.BUTTON1) {
return;
}
for (int i = 0; i < shapes.size(); i++) {
if (shapes.get(i) != null
&& shapes.get(i).contains(e.getPoint())) {
currentIndex = i;
pressed = true;
this.point = e.getPoint();
}
}
}

@Override
public void mouseDragged(MouseEvent e) {
if (pressed) {
int deltaX = e.getX() - point.x;
int deltaY = e.getY() - point.y;
shapes.get(currentIndex).transform(
AffineTransform.getTranslateInstance(deltaX, deltaY));
point = e.getPoint();
repaint();
}
}

@Override
public void mouseReleased(MouseEvent e) {
pressed = false;
}
}
}

最佳答案

我之前写了一些可能对你有帮助的东西

开始,AreaManager (http://sourceforge.net/p/tus/code/HEAD/tree/tjacobs/ui/shape/)这正是您想要的,因为它处理形状(实际上是区域)。有一个使用鼠标拖动的拖动器类和一个使用鼠标滚轮的调整器类。但这并不完全是您所描述的用户界面。

用于根据光标类型和鼠标拖动更改光标和调整大小的用户界面在 Draggable in http://sourceforge.net/p/tus/code/HEAD/tree/tjacobs/ui/drag/ 中。 . Draggable 适用于容器中包含的组件,布局管理器已关闭。但是适应你的目的应该没那么复杂

关于java - 当用户单击并拖动时调整 Path2D 形状的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26432961/

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