Java 使用swing绘制随机图案

Java 使用swing绘制随机图案,java,swing,canvas,draw,Java,Swing,Canvas,Draw,我试图在JavaAWT/swing上练习一些mouseListener事件,我想尝试画出我的鼠标经过的区域。类似于windows paint中的笔刷工具。所以我创建了一个框架,添加了一块画布,并开始用MouseListener的方法进行实验。但无论我做什么,我都不能在点击时画出一个点,然后什么都不画。谁能帮我 编辑: 我已经阅读了下面的链接(非常好的教程),我想我明白了。但当我尝试实现它时,点的arraylist似乎为空。我错过了什么,因为我看不出有什么不对 import java.awt.Co

我试图在JavaAWT/swing上练习一些mouseListener事件,我想尝试画出我的鼠标经过的区域。类似于windows paint中的笔刷工具。所以我创建了一个框架,添加了一块画布,并开始用MouseListener的方法进行实验。但无论我做什么,我都不能在点击时画出一个点,然后什么都不画。谁能帮我

编辑: 我已经阅读了下面的链接(非常好的教程),我想我明白了。但当我尝试实现它时,点的arraylist似乎为空。我错过了什么,因为我看不出有什么不对

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;
        }

    }


}
导入java.awt.Color;
导入java.awt.Dimension;
导入java.awt.Graphics;
导入java.awt.event.MouseEvent;
导入java.awt.event.MouseListener;
导入java.util.ArrayList;
导入javax.swing.JComponent;
导入javax.swing.event.MouseInputListener;
公共类画布扩展JComponent实现MouseInputListener{
private ArrayList coloredPoints=new ArrayList();
专用点Startpnt=null;
私有点Endpnt=null;
私有int-xMin;
私有int-xMax;
私家侦探;
私人国际货币基金组织;
公共画布(){
超级();
//设置首选尺寸(新尺寸(500500));
addMouseListener(这个);
}
公共空间涂料(图g){
g、 设置颜色(颜色为黑色);
g、 fillRect(0,0,getWidth(),getHeight());
对于(int i=0;i
但无论我做什么,我都不能在点击时画出一个点,然后什么都不画

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

你可以从两种常见的方法开始。这个例子画矩形,但是你可以修改它来画点

编辑:

但当我尝试实现它时,点的arraylist似乎为空

是吗?很容易判断。只需在绘制代码中添加System.out.println(..)即可查看有多少条条目

其他意见:

  • 为什么要重写paint()?提供给您的代码重写paintComponent(),这是进行自定义绘制的正确方法

  • 为什么要使用变量“Endppnt”。提供给您的代码使用“endPoint”。同样,Java变量命名标准使用小写字母开始变量名。不要制定自己的约定

  • 不要将您的组件称为“Canvas”。有一个AWT类使用该名称,因此很容易混淆。类名应该更具描述性

  • 您不需要创建自己的Point类,JDK已经有了一个Point类,它可以满足您的需要

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


  • 如果您需要更多帮助,请发布。我们无法告诉您面板是如何添加到框架中的,我们也无法执行您的代码。

    为什么不添加一些代码来显示您所做的工作?如果您要提供您遇到的问题的详细信息,您会更快获得更好的帮助。