2013-10-28 88 views
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); 
    } 

} 

編輯:關於空間更新代碼行(固定)。仍然無法理解爲什麼不畫線,只有最後一個全陣列...

回答

2

要糾正的空間問題,更改行:

g.drawLine(p[i].x, p[i].y, p[++i].x, p[++i].y); 

到:

g.drawLine(p[i].x, p[i].y, p[i + 1].x, p[i + 1].y); 
+0

非常感謝你,但是他們不應該在編程上相同嗎?我的意思是,在p [] .y被評估之前,兩者都應該增加1。如果你知道爲什麼它不,我會讚賞答案。 – fusi0n