我试图在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所以有些东西是自动生成的......
答案 0 :(得分:2)
但无论我做什么,我都无法通过点击一点点而不是一点点。
听起来你只是重新粉刷最后一点。您需要跟踪要绘制的所有点。
您可以先看看Custom Painting Approaches这两种常见方法。此示例绘制矩形,但您应该能够修改它以绘制点。
编辑:
但是当我试图实现它时,点的arraylist似乎是null。
好吧或不是吗?这很容易辨别。只需在绘图代码中添加一个System.out.println(..)即可查看您有多少条目。
其他评论:
你为什么要重写paint()?给你的代码会覆盖paintComponent(),这是进行自定义绘画的正确方法。
为什么你有变量“Endppnt”。给你的代码使用“endPoint”。 Java变量命名标准再次使用小写来启动变量名称。不要自己制定约定。
不要将您的组件称为“画布”。这个名字有一个AWT类,所以令人困惑。类名应该更具描述性。
您无需创建自己的Point类。 JDK已经有了一个可以满足您需求的Point类。
您实际上并不需要startPnt / endPnt逻辑,因为每次拖动鼠标时都会向ArrayList添加一个像素。示例代码需要跟踪开始/结束,以便确定Rectangle的边界。
如果您需要更多帮助,请发布SSCCE。我们无法判断面板是如何添加到框架中的,我们无法执行您的代码。