我还在学习 Java 的基础知识,如果这个问题很基础,我很抱歉。我尝试做的是将点和线存储到ArrayLists
其中,然后让paintComponent()
方法通过它们并在每次调用时绘制它们。由于我的积分使用相同ArrayList
,因此每次按下鼠标时都会清除它,因此新行不会与前一行连接。
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.BorderFactory;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseAdapter;
import java.util.ArrayList;
public class SwingPaintDemo2 {
public static void main(String[] args) {
JFrame f = new JFrame("Swing Paint Demo");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setSize(300,300);
f.add(new MyPanel());
f.setBackground(Color.WHITE);
f.setVisible(true);
}
}
class MyPanel extends JPanel {
private int x;
private int y;
private int x2;
private int y2;
private ArrayList<Point> points = new ArrayList<Point>();
private ArrayList<Curves> curvedLines = new ArrayList<Curves>();
public MyPanel() {
setBorder(BorderFactory.createLineBorder(Color.black));
addMouseMotionListener(new MouseAdapter() {
@Override
public void mouseDragged(MouseEvent e) {
points.add(new Point(e.getX(), e.getY()));
repaint();
}
});
addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
points.clear();
points.add(new Point(e.getX(), e.getY()));
}
@Override
public void mouseReleased(MouseEvent e) {
ArrayList<Point> newPoints = new ArrayList<Point>();
for (int i = 0; i < points.size(); i++) {
newPoints.add(points.get(i));
}
curvedLines.add(new Curves(newPoints));
}
});
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.BLACK);
for (int c = 0; c < points.size() - 1; c++) {
x = (int) points.get(c).getX();
y = (int) points.get(c).getY();
x2 = (int) points.get(c + 1).getX();
y2 = (int) points.get(c + 1).getY();
g.drawLine(x, y, x2, y2);
}
for (int t = 0; t < curvedLines.size(); t++) {
ArrayList<Point> iterator = curvedLines.get(t).points;
for (int c = 0; c < iterator.size() - 1; c++) {
x = (int) iterator.get(c).getX();
y = (int) iterator.get(c).getY();
x2 = (int) iterator.get(c + 1).getX();
y2 = (int) iterator.get(c + 1).getY();
g.drawLine(x, y, x2, y2);
}
}
}
class Curves {
private ArrayList<Point> points;
public Curves(ArrayList<Point> points) {
this.points = new ArrayList<Point>();
this.points = points;
}
}
}
问题是当我拖动鼠标时,没有画线,但它的点仍然被存储,因为当我再次拖动鼠标时线出现了。是什么导致了这种明显的延迟?