0
問題是,我試圖通過保存鼠標按下,拖動鼠標,最終觸發鼠標釋放事件的所有點來在面板上畫線。我在點[]點每行保存它們。這些Point []中的每一個都添加到Point []的ArrayList中。問題是,當我重畫線條時,它只會打印出最後一行,並在線條中留下大量空間,儘管它應該連接2個點,不管它們有多遠。我可能錯過了一些重要的東西或者錯誤地理解了某些東西。面板上的Java GUI繪製線不重新繪製
有人可以看到我做錯了什麼嗎?
代碼是在這裏:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.util.ArrayList;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
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();
//System.out.println("At mouseDragged");
//System.out.println(pointCounter);
//System.out.println(e.getPoint());
}
@Override
public void mousePressed(MouseEvent e) {
//System.out.println("At mousePressed");
//System.out.println(pointCounter);
//System.out.println(e.getPoint());
points[pointCounter] = e.getPoint();
}
@Override
public void mouseReleased(MouseEvent e) {
//System.out.println("At mouseReleased: " + points.length);
pointCounter = 0;
pointsArray.add(points);
System.out.println("pointsArray: " + pointsArray.size());
repaint();
}
@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;
}
}
和流道:
import javax.swing.JFrame;
public class Runner {
public static void main(String[] args) {
Kimp kimp = new Kimp();
kimp.setTitle("Kimp");
kimp.setSize(500, 500);
kimp.setResizable(false);
kimp.setLocation(400, 100);
kimp.setVisible(true);
kimp.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
編輯:關於空間更新代碼行(固定)。仍然無法理解爲什麼不畫線,只有最後一個全陣列...
非常感謝你,但是他們不應該在編程上相同嗎?我的意思是,在p [] .y被評估之前,兩者都應該增加1。如果你知道爲什麼它不,我會讚賞答案。 – fusi0n