我想再提一个以前问过的问题:当鼠标移动时java画线
“我想在我的应用程序中添加一个功能,允许用户在开始位置单击鼠标并在结束位置释放鼠标来绘制直线,直线应随着鼠标的移动而移动,直到最后释放鼠标;类似于使用Microsoft Paint应用程序绘制线的方式。
如何实现这一点,使线在移动时重新绘制,而不重新绘制可能已经在该矩形区域中绘制的其他内容?”
问题是:如何在旧线仍然存在的情况下绘制多条线?
这是我能用的代码,但是一旦你画了一行新的代码,前面的代码就会被删除:
public static void main(String args[]) throws Exception {
JFrame f = new JFrame("Draw a Red Line");
f.setSize(300, 300);
f.setLocation(300, 300);
f.setResizable(false);
JPanel p = new JPanel() {
Point pointStart = null;
Point pointEnd = null;
{
addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent e) {
pointStart = e.getPoint();
}
public void mouseReleased(MouseEvent e) {
pointStart = null;
}
});
addMouseMotionListener(new MouseMotionAdapter() {
public void mouseMoved(MouseEvent e) {
pointEnd = e.getPoint();
}
public void mouseDragged(MouseEvent e) {
pointEnd = e.getPoint();
repaint();
}
});
}
public void paint(Graphics g) {
super.paint(g);
if (pointStart != null) {
g.setColor(Color.RED);
g.drawLine(pointStart.x, pointStart.y, pointEnd.x, pointEnd.y);
}
}
};
f.add(p);
f.setVisible(true);
}
2条答案
按热度按时间qhhrdooz1#
这是我能用的代码,但是一旦你画了一行新的代码,前面的代码就会被删除:
有两种常见的方法:
1.保留一个要绘制的对象的ArrayList,然后在组件每次需要重画自己时,paintComponent()方法重画所有对象
1.在BufferImage上绘制,然后只绘制BufferedImage。
请查看Custom Painting Approaches以获得这两种方法的工作示例。
omhiaaxx2#
刚刚设置鼠标释放
点开始= e.获取点,而不是点开始=空。
不需要任何列表或类似的东西,当您将其设置为null时,它将从头开始并删除最后一个列表