使用swing绘制随机模式

时间:2014-08-18 20:26:39

标签: java swing canvas draw

我试图在java awt / swing上练习一些mouseListener事件,我想尝试绘制鼠标经过的区域。像窗户画笔中的画笔工具。所以我创建了一个添加了画布的框架,并开始尝试使用MouseListener的方法。但无论我做什么,我都无法移动过去点击一个点,然后什么都没有。有人能帮帮我......

修改: 我已经阅读了下面的链接(非常好的教程),我认为我得到了它。但是当我试图实现它时,点的arraylist似乎是null。我错过了什么,因为我看不出有什么问题......

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.ArrayList;

import javax.swing.JComponent;
import javax.swing.event.MouseInputListener;



public class Canvas extends JComponent implements MouseInputListener{

    private ArrayList<Point> coloredPoints = new ArrayList<Point>();

    private Point Startpnt = null;
    private Point Endpnt = null;

    private int xMin;
    private int xMax;
    private int yMin;
    private int yMax;

    public Canvas() {
        super();
        //setPreferredSize(new Dimension(500,500));
        addMouseListener(this);
    }

    public void paint(Graphics g){
        g.setColor(Color.BLACK);
        g.fillRect(0, 0, getWidth(),getHeight());

        for (int i=0; i<coloredPoints.size(); i++)
        {
            int pX = coloredPoints.get(i).getX();
            int pY = coloredPoints.get(i).getY(); 
            g.setColor(Color.red);
            g.drawRect(pX, pY, 1, 1);

        }

    }

    @Override
    public void mouseClicked(MouseEvent e) {

    }

    @Override
    public void mouseEntered(MouseEvent e) {
        // TODO Auto-generated method stub

    }

    @Override
    public void mouseExited(MouseEvent e) {
        // TODO Auto-generated method stub

    }

    @Override
    public void mousePressed(MouseEvent e) {
        Startpnt.setX(getX());
        Startpnt.setY(getY());
        Endpnt = Startpnt;
        coloredPoints.add(Endpnt);

        xMin = Startpnt.getX();
        xMax = Startpnt.getX();
        yMin = Startpnt.getY();
        yMax = Startpnt.getY(); 

    }

    @Override
    public void mouseDragged(MouseEvent e)
    {
        //  Repaint only the area affected by the mouse dragging
        Endpnt.setX(e.getX());
        Endpnt.setY(e.getY());
        xMin = Math.min(xMin, Endpnt.getX());
        xMax = Math.max(xMax, Endpnt.getX());
        yMin = Math.min(yMin, Endpnt.getY());
        yMax = Math.max(yMax, Endpnt.getY());
        repaint(xMin, yMin, 1, 1);
        coloredPoints.add(Endpnt);
    }

    @Override
    public void mouseReleased(MouseEvent e) {
        Startpnt = null;
    }

    @Override
    public void mouseMoved(MouseEvent arg0) {
        // TODO Auto-generated method stub

    }

    class Point {
        private int x;
        private int y;

        public int getX() {
            return x;
        }
        public void setX(int x) {
            this.x = x;
        }
        public int getY() {
            return y;
        }
        public void setY(int y) {
            this.y = y;
        }

    }


}

这是我为canvas类编写的代码。我希望有一个黑色背景并绘制红色图案...... 我使用eclipse所以有些东西是自动生成的......

1 个答案:

答案 0 :(得分:2)

  

但无论我做什么,我都无法通过点击一点点而不是一点点。

听起来你只是重新粉刷最后一点。您需要跟踪要绘制的所有点。

您可以先看看Custom Painting Approaches这两种常见方法。此示例绘制矩形,但您应该能够修改它以绘制点。

编辑:

  

但是当我试图实现它时,点的arraylist似乎是null。

好吧或不是吗?这很容易辨别。只需在绘图代码中添加一个System.out.println(..)即可查看您有多少条目。

其他评论:

  1. 你为什么要重写paint()?给你的代码会覆盖paintComponent(),这是进行自定义绘画的正确方法。

  2. 为什么你有变量“Endppnt”。给你的代码使用“endPoint”。 Java变量命名标准再次使用小写来启动变量名称。不要自己制定约定。

  3. 不要将您的组件称为“画布”。这个名字有一个AWT类,所以令人困惑。类名应该更具描述性。

  4. 您无需创建自己的Point类。 JDK已经有了一个可以满足您需求的Point类。

  5. 您实际上并不需要startPnt / endPnt逻辑,因为每次拖动鼠标时都会向ArrayList添加一个像素。示例代码需要跟踪开始/结束,以便确定Rectangle的边界。

  6. 如果您需要更多帮助,请发布SSCCE。我们无法判断面板是如何添加到框架中的,我们无法执行您的代码。