Java 如何使用MouseListener和MouseMotionListener绘图

Java 如何使用MouseListener和MouseMotionListener绘图,java,swing,mouseevent,paintcomponent,mouselistener,Java,Swing,Mouseevent,Paintcomponent,Mouselistener,我正在创建一个程序,您可以使用MouseListener和MouseMotionListener在JPanel中绘制矩形。但是,当我运行该程序时,会出现nullPointer异常,这是由于没有输入任何参数来绘制矩形而导致的。问题在于程序如何不允许用户在屏幕上绘制矩形以给出矩形的参数 到目前为止,我只想画一个矩形,但在最后的程序将需要画多个矩形,所以在这方面的任何帮助将是巨大的 代码如下: public class RectangleFrame extends JFrame implements

我正在创建一个程序,您可以使用MouseListener和MouseMotionListener在JPanel中绘制矩形。但是,当我运行该程序时,会出现nullPointer异常,这是由于没有输入任何参数来绘制矩形而导致的。问题在于程序如何不允许用户在屏幕上绘制矩形以给出矩形的参数

到目前为止,我只想画一个矩形,但在最后的程序将需要画多个矩形,所以在这方面的任何帮助将是巨大的

代码如下:

public class RectangleFrame extends JFrame implements ActionListener {


JPanel buttonPanel;
JButton saveImage;
JButton clearImage;
JCheckBox intersections;
JCheckBox union;
JPanel drawingArea;

public RectangleFrame()
{
    super();
    setTitle("Rectangles");
    setSize(600,600);
    setResizable(false);
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    buttonPanel = new JPanel();
    buttonPanel.setBorder(BorderFactory.createLineBorder(Color.black));
    this.add(buttonPanel, BorderLayout.SOUTH);

    intersections = new JCheckBox("Draw Intersections");
    buttonPanel.add(intersections);

    union = new JCheckBox("Draw Union");
    buttonPanel.add(union);

    saveImage = new JButton("Save Image");
    saveImage.setMargin(new Insets(0,0,0,0));
    buttonPanel.add(saveImage);

    clearImage = new JButton("Clear Image");
    clearImage.setMargin(new Insets(0,0,0,0));
    buttonPanel.add(clearImage);

    drawingArea = new RectanglePanel();
    drawingArea.setBorder(BorderFactory.createLineBorder(Color.blue));
    this.add(drawingArea, BorderLayout.CENTER);
    drawingArea.setVisible(true);
    drawingArea.addMouseListener((MouseListener) drawingArea);
    drawingArea.addMouseMotionListener((MouseMotionListener) drawingArea);
}

    @Override
    public void actionPerformed(ActionEvent arg0) 
    {
        // TODO Auto-generated method stub

    }





}

class RectanglePanel extends JPanel implements MouseListener, MouseMotionListener {


Rectangle rectangle;
int x2, y2;

public RectanglePanel()
{
    super();
}   

@Override
public void mouseDragged(MouseEvent arg0) 
{

    // TODO Auto-generated method stub
}



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

}



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

}



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

}



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

}



@Override
public void mousePressed(MouseEvent arg0) 
{
    rectangle.setX(arg0.getX());
    rectangle.setY(arg0.getY());

    repaint();

}



@Override
public void mouseReleased(MouseEvent arg0)
{
    x2 = arg0.getX();
    y2 = arg0.getY();

    rectangle.setWidth(Math.abs(rectangle.getX() - x2));
    rectangle.setHeight(Math.abs(rectangle.getY() - y2));   

    repaint();
}



@Override
public void paintComponent(Graphics g) 
{
    super.paintComponent(g);
    g.setColor(Color.BLUE);
    g.fillRect(rectangle.getX(), rectangle.getY(), rectangle.getWidth(), rectangle.getHeight());
}

}

您需要在mousePressed上创建一个新的矩形对象,然后将其分配给矩形变量。然后,您可以在mouseDragged方法中更改其状态

或者更好地使用在鼠标事件上设置的点对象:

i、 e

同样在paintComponent中,如果矩形不为空,则仅绘制矩形

@Override
public void paintComponent(Graphics g) {
  super.paintComponent(g);
  if (rectangle != null) {
    Graphics2D g2 = (Graphics2D) g;
    g2.setColor(Color.BLUE);
    g2.fill(rectangle);
  }
}
至于

到目前为止,我只想画一个矩形,但在最后的程序将需要画多个矩形,所以在这方面的任何帮助将是巨大的


这很容易。创建一个ArrayList,并在MouseRelease上将创建的矩形对象放入列表中。在paintComponent方法中,使用for循环遍历列表,绘制其中包含的每个矩形。

您需要在mousePressed上创建一个新的矩形对象,然后将其指定给矩形变量。然后,您可以在mouseDragged方法中更改其状态

或者更好地使用在鼠标事件上设置的点对象:

i、 e

同样在paintComponent中,如果矩形不为空,则仅绘制矩形

@Override
public void paintComponent(Graphics g) {
  super.paintComponent(g);
  if (rectangle != null) {
    Graphics2D g2 = (Graphics2D) g;
    g2.setColor(Color.BLUE);
    g2.fill(rectangle);
  }
}
至于

到目前为止,我只想画一个矩形,但在最后的程序将需要画多个矩形,所以在这方面的任何帮助将是巨大的

这很容易。创建一个ArrayList,并在MouseRelease上将创建的矩形对象放入列表中。在paintComponent方法中,使用for循环遍历列表,绘制其中包含的每个矩形。

查看两种允许绘制矩形的解决方案:

从列表中绘制矩形 在BuffereImage上绘制矩形 查看两种可用于绘制矩形的解决方案:

从列表中绘制矩形 在BuffereImage上绘制矩形