2015-04-16 34 views
0

首先这个问题是OS X才有效我不知道是什么原因,如果有人能告诉我...(他工作正常,在Linux和Windows)的drawLine JAVA不留在Mac OS X

当我点击绘制时,旧点消失而不是停留。 如果你删除了关于super.paintComponent的注释,结果在osx上是一样的,但在window和linux上是不同的。

单击以绘制。

import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.GridLayout; 
import java.awt.Point; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class Stack extends JPanel { 
    JFrame jf; 
    Panneau jp; 
    Point p; 

    public Stack() { 
     p = new Point(); 
     jf = new JFrame("Window"); 
     jp = new Panneau(); 
     jp.setBackground(Color.white); 
     jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     jf.setSize(800,600); 
     jf.setLayout(new GridLayout()); 
     jf.add(jp); 
     jf.setVisible(true); 

     jp.addMouseListener(new MouseAdapter(){ 
      public void mouseClicked(MouseEvent e){ 
       setPoint(p); 
       jp.repaint(); 
      } 
     }); 
    } 

    public void setPoint(Point p) { 
     this.p.x += 10; 
     this.p.y += 10; 
    } 

    public class Panneau extends JPanel { 
     public void paintComponent(Graphics g) { 
      // super.paintComponent(g); 
      g.drawLine(p.x, p.y, p.x+5, p.y+5); 
     } 
    } 

    public static void main (String []args) { 
     Stack s = new Stack(); 
    } 
} 

回答

2

这是因为你不会重新绘制,你以前的点所在的区域,显然在Mac上,它重绘由于某种原因,该区域?

但重点是,你不应该依靠绘制更多的点,因为没有绘制在以前的区域,你应该总是调用super.paintComponent(g)。我建议您创建一个点列表,然后在重绘时绘制所有这些点。

我已经采取了创建此代码自己的自由,我希望你明白什么即时通讯在这里做什么:

import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.GridLayout; 
import java.awt.Point; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import java.util.ArrayList; 
import java.util.List; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class Stack extends JPanel { 
    JFrame jf; 
    Panneau jp; 
    //List of points instead of one point 
    List<Point> points; 

    public Stack() { 
     //Instantiating the list 
     points = new ArrayList<Point>(); 
     jf = new JFrame("Window"); 
     jp = new Panneau(); 
     jp.setBackground(Color.white); 
     jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     jf.setSize(800,600); 
     jf.setLayout(new GridLayout()); 
     jf.add(jp); 
     jf.setVisible(true); 

     jp.addMouseListener(new MouseAdapter(){ 
      public void mouseClicked(MouseEvent e){ 
       //Adding a new point to the list 
       addPoint(); 
       jp.repaint(); 
      } 
     }); 
    } 

    public void addPoint() { 
     if(points.isEmpty()){ 
      //If this is the first point to be added, set it to 0,0 
      points.add(new Point(0, 0)); 
     }else{ 
      //Get the last point currently in the list 
      Point lastPoint = points.get(points.size()-1); 
      //Create the newpoint, 10px right and 10px down from the current point 
      Point newPoint = new Point(lastPoint.x + 10, lastPoint.y + 10); 
      //Add the new point to the list 
      points.add(newPoint); 
     } 
    } 

    public class Panneau extends JPanel { 
     public void paintComponent(Graphics g) { 
      //Make sure the background is drawn! Should always be called 
      super.paintComponent(g); 
      //Iterate over all the points and draw them all 
      for(Point p : points){ 
       g.drawLine(p.x, p.y, p.x + 5, p.y + 5); 
      } 
     } 
    } 

    public static void main (String []args) { 
     Stack s = new Stack(); 
    } 
} 
+0

OK不错我也明白了,我必须补充一点,并重复我在同一时间就行了!谢谢 – 0x4d