我已经在Java Swing中的哥本哈根制作了一张地图,但是我希望能够在地图上画新的行,然后将它们添加到现有行,我从我的缓冲读者那里求助。我尝试将新的绘制线添加到临时行的阵列列表中,但这似乎不起作用 - 我根本无法再绘制画布了。谁能帮忙?
public class Model extends Observable implements Iterable<Line2D>, Serializable {
private List<Line2D> lines;
private List<Line2D> tmpLines;
public Model() {
lines = new ArrayList<>();
tmpLines = new ArrayList<>();
}
public Model(String filename) {
readFromFile(filename);
}
public void add(Line2D line) {
lines.add(line);
dirty();
}
public void dirty() {
setChanged();
notifyObservers();
}
public void readFromFile(String filename) {
lines = new ArrayList<>();
tmpLines = new ArrayList<>();
try {
BufferedReader b = new BufferedReader(new FileReader(filename));
for (String line = b.readLine(); line != null; line = b.readLine() ) {
String[] tokens = line.split(" ");
if (tokens[0].equals("LINE")) {
double x1 = Double.parseDouble(tokens[1]);
double y1 = Double.parseDouble(tokens[2]);
double x2 = Double.parseDouble(tokens[3]);
double y2 = Double.parseDouble(tokens[4]);
lines.add(new Line2D.Double(x1, y1, x2, y2));
}
}
}
catch (FileNotFoundException e) {
e.printStackTrace();
}
catch (IOException e) {
e.printStackTrace();
}
}
/**
* Returns an iterator over elements of type {@code T}.
*
* @return an Iterator.
*/
@Override
public Iterator<Line2D> iterator() {
return lines.iterator();
}
public Line2D removeLastFromTmpLines() {
Line2D line = tmpLines.remove(tmpLines.size() - 1);
dirty();
return line;
}
public Line2D removeLastFromLines() {
Line2D line = lines.remove(lines.size() - 1);
dirty();
return line;
}
public void addTmpLinesToLines() {
lines.addAll(tmpLines);
dirty();
}
public void addToTmpLines(Line2D line2D) {
tmpLines.add(line2D);
dirty();
}
public List<Line2D> getTmpLines() {
return tmpLines;
}
}
public class MouseController extends MouseAdapter {
private Model model;
private CanvasView canvas;
private Point2D lastMousePosition;
public MouseController(CanvasView c, Model m) {
canvas = c;
model = m;
canvas.addMouseListener(this);
canvas.addMouseWheelListener(this);
canvas.addMouseMotionListener(this);
}
@Override
public void mouseDragged(MouseEvent e) {
Point2D currentMousePosition = e.getPoint();
if (canvas.inDrawingMode()) {
Point2D origin = model.removeLastFromTmpLines().getP1();
model.addToTmpLines(new Line2D.Double(origin, canvas.toModelCoords(currentMousePosition)));
}
else {
double dx = currentMousePosition.getX() - lastMousePosition.getX();
double dy = currentMousePosition.getY() - lastMousePosition.getY();
canvas.pan(dx, dy);
}
lastMousePosition = currentMousePosition;
}
@Override
public void mousePressed(MouseEvent e) {
lastMousePosition = e.getPoint();
if (canvas.inDrawingMode()) {
model.addToTmpLines(new Line2D.Double(
canvas.toModelCoords(lastMousePosition),
canvas.toModelCoords(lastMousePosition)));
}
}
public void mouseMoved(MouseEvent e) {
Point2D modelCoords = canvas.toModelCoords(e.getPoint());
//System.out.println("Screen: [" + e.getX() + ", " + e.getY() + "], "+"Model: [" + modelCoords.getX() + ", " + modelCoords.getY() + "]");
}
@Override
public void mouseWheelMoved(MouseWheelEvent e) {
double factor = pow(1.1, e.getWheelRotation());
canvas.zoom(factor, -e.getX(), -e.getY());
}
}
说实话,我不太了解代码,因为我看不到油漆方法,所以我看不到您对数组的处理方式。我认为您在列表中添加行,并使用迭代方法将它们返回到油漆方法中。
我认为当按下鼠标按钮时,您会添加一个点,而不是行:
model.addToTmpLines(new Line2D.Double(
canvas.toModelCoords(lastMousePosition),
canvas.toModelCoords(lastMousePosition)));
一个点,因为坐标相同。然后,当拖动鼠标时,您会删除最后一行(点(,然后从点的起始坐标添加新线条到实际鼠标位置。这样对吗?但是,您什么时候将直线从TMP列表传递给真实列表?您不需要一种慕斯释放方法才能将线条从TMP列表传递到真实列表吗?迭代器方法仅返回列表行,因此我认为最后一行,拖动的行,没有绘制,因为实际的新行在TMPlines列表中,并且未返回。
但我认为我没有看到整个图片,所以我的评论可能无用...