Я пытаюсь сделать изменить размер a Rectangle2D
используя метод перетаскивания мышью. Кроме того, я хочу рекуператор он находится в середине JPanel
. Я думаю, что код и формулы верны, но он не работает должным образом, потому что слишком сильно изменяет размер прямоугольника, и он не подходит под курсором.Невозможно изменить размер Rectangle2D в соответствии с курсором
Здесь я отправлю соответствующие коды.
Конструктор
public Canvas(double width, double height) {
this.width = width;
this.height = height;
rect = new Rectangle2D.Double(this.x, this.y, this.width, this.height);
vertex = new Rectangle2D[4];
this.addMouseMotionListener(this);
this.addMouseListener(this);
}
vertex
является массивом Rectangle2D
, нарисованного к вершинам прямоугольника, только если указатель мыши находится внутри
paintComponent:
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
//RETTANGOLO
Graphics2D g2 = (Graphics2D)g;
Stroke oldStroke = g2.getStroke();
g2.setStroke(new BasicStroke(SPESSORE));
g2.draw(rect);
g2.setStroke(oldStroke);
g2.setColor(Color.BLACK);
setAtCenter();
//VERTICI
vertex[0] = new Rectangle2D.Double(this.x, this.y, SIZEV, SIZEV);
vertex[1] = new Rectangle2D.Double(this.x + this.width - SIZEV,
this.y, SIZEV, SIZEV);
vertex[2] = new Rectangle2D.Double(this.x, this.y + this.height - SIZEV,
SIZEV, SIZEV);
vertex[3] = new Rectangle2D.Double(this.x + this.width - SIZEV,
this.y + this.height - SIZEV,
SIZEV, SIZEV);
if (dentro) {
for (int i = 0; i < 4; i++) {
g2.draw(vertex[i]);
}
}
}
private void setAtCenter() {
this.x = ((this.getWidth()/2) - (this.width/2));
this.y = ((this.getHeight()/2) - (this.height/2));
rect.setRect(x, y, this.width, this.height);
}
mouseMoved:
@Override
public void mouseMoved(MouseEvent e) {
dentro = false;
inVertex = -1;
if (rect.contains(e.getPoint())) {
dentro = true;
}
for (int i = 0; i < 4; i++) {
if (vertex[i].contains(e.getPoint())) {
inVertex = i;
break;
}
}
}
mousePressed:
@Override
public void mousePressed(MouseEvent e) {
if (inVertex >= 0) {
this.startX = e.getX();
this.startY = e.getY();
}
}
mouseDragged:
@Override
public void mouseDragged(MouseEvent e) {
double dX;
double dY;
if (inVertex >= 0) {
this.endX = e.getX();
this.endY = e.getY();
dX = startX - endX;
dY = startY - endY;
this.width += dX;
this.height += dY;
this.repaint();
}
}
Я надеюсь, что я отправил все необходимую информацию и, наконец, кто-то поможет мне для решения этой проблемы, одолжил меня.
EDIT: Я решил проблему, отслеживая положение вершин, задав соответственно ширину и высоту. Я упростил код, позволяющий изменять размер только из исходной вершины. Спасибо за поддержку.
Спасибо всем!
Я пробовал ваше решение, и теперь изменение размера замедляется по сравнению с позицией курсора.Поэтому я попытаюсь следовать вашим советам и отслеживать каждую позицию вершин и каждый раз перерисовывать прямоугольник в зависимости от положения вершин. Но я надеюсь, что он будет работать с моим методом 'setAtCenter()' – Shafa95
. Я решил проблему, отслеживая положение вершин, задав соответственно ширину и высоту. Я упростил код, позволяющий изменять размер только из исходной вершины. Спасибо за поддержку. – Shafa95