因此,我尝试从单击鼠标开始动态绘制多边形,直到停止拖动并释放为止。就这个问题而言,当我单击、向下拖动、然后向右拖动、然后向上拖动、然后向左拖动时,会绘制一个方形轮廓,而会发生以下情况: /image/QsYw9.jpg
有什么建议吗?
注释:
model.addPolygon() 创建一个带有起点的多边形,并将其添加到名为“polys”的 ArrayList
model.addPolygonPoint() 将点添加到存储在“polys”中的创建的多边形
我的绘制函数通过多边形迭代进行绘制
public void mousePressed(MouseEvent e) {
oldX = e.getX();
oldY = e.getY();
model.addPolygon(oldX, oldY);
}
public void mouseDragged(MouseEvent e) {
currentX = e.getX();
currentY = e.getY();
model.addPolyPoint(currentX, currentY);
repaint();
}
。 。 。然后在paintComponent中:
for (ListIterator<Polys> iter =
model.polys.listIterator(model.polys.size());
iter.hasPrevious();){
graphics2D.draw(iter.previous().poly);
完整的绘制组件:
public void paintComponent(Graphics g) {
super.paintComponent(g);
if (image == null) {
image = createImage(getSize().width, getSize().height);
graphics2D = (Graphics2D) image.getGraphics();
graphics2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
}
g.drawImage(image, 0, 0, null);
for (ListIterator<Polys> iter =
model.polys.listIterator(model.polys.size());
iter.hasPrevious();){
graphics2D.draw(iter.previous().poly);
}
}
最佳答案
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);
}
}
如您所见,我用定义的点制作了一个基本形状。这是最有效的方法,除非您希望改 rebase 本形状(这里是静态的)。在这种情况下,您可以找到鼠标“抓取”的点并修改该点。无论哪种方式,都不需要添加或删除点。我只是根据喜好使用术语 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 种方法。
如果您有任何疑问,请随时询问我。
~图例
关于java - drawPolygon 保持从起始(鼠标按下)位置到当前(鼠标拖动)位置的绘制线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15396258/