【问题标题】:I have a frame with different shapes that I would like to move, but only one moves so far我有一个不同形状的框架我想移动,但到目前为止只有一个移动
【发布时间】:2020-03-15 17:40:18
【问题描述】:

我的意图是能够在我的框架中移动三个不同的形状。但到目前为止我只能移动正方形。有什么建议可以让程序移动我所有的形状,而不仅仅是一个? 我下面有一些方法和类

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseWheelEvent;
import java.awt.event.MouseWheelListener;
import java.awt.geom.Rectangle2D;
import java.awt.geom.Ellipse2D;

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

public class MouseMoveScale extends JPanel {
private Rectangle2D.Float myRect = new Rectangle2D.Float(50, 50, 100, 100);
private Ellipse2D.Float myCr = new Ellipse2D.Float(10,10, 100, 100);
private Rectangle2D.Float myTr = new Rectangle2D.Float(50, 50, 50, 50);

MovingAdapter ma = new MovingAdapter();

public MouseMoveScale() {
    addMouseMotionListener(ma);
    addMouseListener(ma);
    addMouseWheelListener(new ScaleHandler());
}

public void paint(Graphics g) {
    super.paint(g);

    Graphics2D square = (Graphics2D) g;
    Graphics2D triangle = (Graphics2D) g;
    Graphics2D circle = (Graphics2D) g;

    square.setRenderingHint(RenderingHints.KEY_ANTIALIASING,   RenderingHints.VALUE_ANTIALIAS_ON);
    square.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
    square.setColor(new Color(0, 0, 200));
    square.fill(myRect);

    triangle.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
    triangle.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
    triangle.setColor(new Color(139, 89, 255));
    int xPoints[] = {110,180,30,110};
    int yPoints[] = {30,100,100,30};
    g.fillPolygon(xPoints, yPoints, 4);

    circle.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
    circle.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
    circle.setColor(new Color(0, 0, 117));
    circle.fillOval( 10,10, 100, 100 );
}

class MovingAdapter extends MouseAdapter {

    private int x;
    private int y;

    public void mousePressed(MouseEvent e) {
        x = e.getX();
        y = e.getY();
    }

    public void mouseDragged(MouseEvent e) {

        int dx = e.getX() - x;
        int dy = e.getY() - y;


        if (myRect.getBounds2D().contains(x, y)) {
            myRect.x += dx;
            myRect.y += dy;
            repaint();
        }
        if (myTr.getBounds2D().contains(x, y)) {
            myTr.x += dx;
            myTr.y += dy;
            repaint();
        }
        if (myCr.getBounds2D().contains(x, y)) {
            myCr.x += dx;
            myCr.y += dy;
            repaint();
        }

        x += dx;
        y += dy;
    }
}

class ScaleHandler implements MouseWheelListener {
    public void mouseWheelMoved(MouseWheelEvent e) {

        int x = e.getX();
        int y = e.getY();

        if (e.getScrollType() == MouseWheelEvent.WHEEL_UNIT_SCROLL) {

            if (myRect.getBounds2D().contains(x, y)) {
                float amount = e.getWheelRotation() * 5f;
                myRect.width += amount;
                myRect.height += amount;
                repaint();
            }
        }

    }
}

public static void main(String[] args) {
    JFrame frame = new JFrame("Shapes World");
    MouseMoveScale m = new MouseMoveScale();
    m.setDoubleBuffered(true);
    frame.add(m);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(300, 300);
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);
}

}

我可能需要创建新对象? 或者是否足以解决 if 语句的问题?

【问题讨论】:

标签: java


【解决方案1】:

我认为这是你的错误

triangle.setColor(new Color(139, 89, 255));
int xPoints[] = {110,180,30,110};
int yPoints[] = {30,100,100,30};
g.fillPolygon(xPoints, yPoints, 4); ---> Notice this.

您正在尝试在不更改已使用的 xpoints/ypoints 的情况下移动记录。

   if (myTr.getBounds2D().contains(x, y)) {
        myTr.x += dx; ---> not related to xPoints
        myTr.y += dy; ---> not related to yPoints
        repaint();
    }

您可以使用 - 更改 - g.fillPolygon for e.x -

 triangle.fill(myCr);

我们的结果

所以现在你可以移动 2 个对象。

【讨论】:

  • 我现在试试
  • 让我知道,编辑并添加了它现在如何工作的照片;)
  • 它有效,谢谢,但现在所有形状都在同一个“鼠标区域”中移动,我想我需要进一步改进我的代码
  • 我的圆形和方形现在可以工作了,但不是三角形,我应该如何传递 xPoints 和 yPoints?
猜你喜欢
  • 2021-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-25
  • 1970-01-01
  • 1970-01-01
  • 2019-03-15
  • 2017-08-10
相关资源
最近更新 更多