【发布时间】:2013-10-29 18:30:19
【问题描述】:
我正在尝试制作一个线描程序。当我尝试重绘所有线条时(在创建新线条之后),只有最后一条被绘制出来。问题可能出在重绘中。
谁能看出我做错了什么?
代码在这里:
public class Kimp extends JFrame {
private ArrayList<Point[]> pointsArray = new ArrayList<>();
private Point points[] = new Point[10000];
private int pointCounter = 0;
public Kimp () {
panel paintArea = new panel();
add(paintArea, BorderLayout.CENTER);
}
private class panel extends JPanel {
public panel () {
HandlerClass handler = new HandlerClass();
this.addMouseListener(handler);
this.addMouseMotionListener(handler);
}
@Override
void paintComponent(Graphics g) {
super.paintComponent(g);
try {
for (Point[] p : pointsArray) {
for(int i = 0; i < p.length; i++) {
if (p[i].x == 0) {
continue;
} else {
if (p[i + 1].x == 0) {
g.setColor(Color.BLUE);
g.drawLine(p[i].x, p[i].y, p[i].x, p[i].y);
} else {
g.setColor(Color.BLUE);
g.drawLine(p[i].x, p[i].y, p[i + 1].x, p[i + 1].y);
}
}
}
}
points = preFill(points);
} catch (NullPointerException e) {
}
}
}
private class HandlerClass implements MouseListener , MouseMotionListener {
@Override
public void mouseDragged(MouseEvent e) {
points[pointCounter++] = e.getPoint();
}
@Override
public void mousePressed(MouseEvent e) {
points[pointCounter] = e.getPoint();
}
@Override
public void mouseMoved(MouseEvent e) {
}
@Override
public void mouseClicked(MouseEvent e) {
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {
}
}
public static Point[] preFill (Point[] points) {
for (int i = 0; i < points.length; i++) {
points[i] = new Point(-999,-999);
}
return points;
}
}
【问题讨论】:
-
private Point points[] = new Point[10000];- 只是不要。为此使用 ArrayList!因为加载这么多内存的目的是什么,当你不知道你会用多少的时候?其次,不要抓NullPointerException -
加上一条线可能使用超过 10000 点的方式,所以不要随意限制数量(或者只有在一定数量的点之后通过反复试验看到明显的性能问题) .
标签: java swing user-interface jpanel paintcomponent