简单草图的代码效果不佳

时间:2015-03-03 18:13:28

标签: java swing graphics

我是java的新手,也是java Graphics的新手。我写了一个简单的草图代码,但效果不佳。当我快速拖动鼠标时,会遗漏一些像素。这是我的代码..

package test;

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JPanel;

public class testdraw extends JPanel{
    public int x1;
    public int y1;
    public int x2;
    public int y2;
    public testdraw(){
    addMouseMotionListener(new MouseAdapter() {

        public void mouseDragged(MouseEvent e){
            x2=e.getX();
            y2=e.getY();
            repaint();
            x1=x2;
            y1=y2;

        }


    });

}
    public void paintComponent(Graphics g){

        Graphics2D g2=(Graphics2D)g;
        g2.drawLine(this.x1, this.y1,this.x2,this.y2);;

    }
}   

主要课程..

package test;

import javax.swing.JFrame;
public class testdrawmain {

    public static void main(String args[]){
        JFrame frame=new JFrame();
        testdraw td=new testdraw();
        frame.add(td);
        frame.setSize(350, 350);
        frame.setVisible(true);

   }

}

有人可以告诉我有什么问题。请建议我。提前谢谢。

1 个答案:

答案 0 :(得分:2)

        x2=e.getX();
        y2=e.getY();
        repaint();
        x1=x2;
        y1=y2;

x1和x2在此之后将是相同,无论您在何处调用repaint() - 都不是很有用。

而是在之前获取鼠标位置。

        x1=x2;
        y1=y2;
        x2=e.getX();
        y2=e.getY();
        repaint();

如果你想绘制所有点,那么创建一个ArrayList<Point>,添加到鼠标运动监听器的列表中,并在paintComponent中迭代列表。

此外:

  • paintComponent应该受到保护,而不是公开。
  • 必须在您自己的覆盖中调用超级paintComponent方法。
  • 请查看this example

修改
你的评论:

  

我的应用程序可以像绘画一样绘制......所以当每次拖动鼠标时,开始和结束坐标都会改变

然后你有两个选择:使用ArrayList<ArrayList<Point>>或绘制BufferedImage并在paintComponent方法中显示BufferedImage。