import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
public class Testing {
private static int lastX;
private static int lastY;
private static int modX;
private static int modY;
private static final BasicStroke STROKE = new BasicStroke(2.0F);
private static final Point[] SHAPE = new Point[]{
new Point(10, 10),
new Point(10, 40),
new Point(60, 90),
new Point(50, 50)
};
public static void main(final String[] args) {
final JFrame frame = new JFrame("Polygon Movement");
final JPanel pane = new JPanel() {
@Override
public void paintComponent(final Graphics g1) {
final Graphics2D g = (Graphics2D) g1;
g.setColor(Color.RED);
g.translate(modX, modY);
g.setStroke(STROKE);
for (int i = 0; i < SHAPE.length; i++) {
g.drawLine(SHAPE[i].x, SHAPE[i].y, SHAPE[(i + 1) % SHAPE.length].x, SHAPE[(i + 1) % SHAPE.length].y);
}
}
};
pane.addMouseMotionListener(new MouseMotionAdapter() {
@Override
public void mouseDragged(MouseEvent e) {
modX += e.getX() - lastX;
modY += e.getY() - lastY;
lastX = e.getX();
lastY = e.getY();
frame.repaint();
}
});
pane.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
lastX = e.getX();
lastY = e.getY();
}
});
pane.setPreferredSize(new Dimension(200, 200));
frame.add(pane);
frame.pack();
frame.setVisible(true);
}
}
正如你所看到的,我用定义的点制作了一个基本形状。这是最有效的方法,除非您想改变基本形状(这里是静态的)。在这种情况下,您可以找到鼠标“抓取”的点并修改该点。无论哪种方式,都不需要添加或删除点。我使用条款lastX
代替oldX
只是根据喜好。
BasicStroke 是相当可选的,与转换为Graphics2D
目的。
该行:
g.drawLine(SHAPE[i].x, SHAPE[i].y, SHAPE[(i + 1) % SHAPE.length].x, SHAPE[(i + 1) % SHAPE.length].y);
如果你以前尝试过这个东西,应该会有意义。它迭代所有点,从当前 (SHAPE[i]
) 到下一个 (SHAPE[(i + 1) & SHAPE.length
).
这个逻辑背后的原因是,你有 4 点,就像我们在这里所做的那样。通过它们的最后一次迭代,您将得到i = 3
。由于这一点以及数组仅包含 4 个索引 (0-3),我们必须将该值恢复为零。为了简单起见,我使用% SHAPE.length
所以不需要特殊情况。
我还选择使用适配器,因为 7 种可能的方法中只需要 2 种方法。
如果您有任何疑问,请随时向我询问。
~Legend