チーズパン
チーズパン

Reputation: 2778

Problem with drawing

For now the following code is supposed to draw a circle onMouseDragged over the black Canvas. Unfortunately it doesn't (= Do I miss something?

Thanks in advance...

import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.applet.*;
import java.awt.Graphics.*;



public class IdrawApplet extends Applet  {  


    int mosX;
    int mosY;
    Panel pGadgets;
    Canvas myCanvas;
    Label lRed;
    TextField tfRed;
    TextField tfGreen;
    TextField tfBlue;
    Label lGreen;
    Label lBlue;

    Graphics g;

  public void init() {

    g = getGraphics();
    lRed = new Label("Red-value: ");
    lBlue = new Label("Blue-value: ");
    lGreen = new Label("Green-value: ");
    tfRed = new TextField();
    tfRed.setText("255");
    tfGreen = new TextField();
    tfGreen.setText("255");
    tfBlue = new TextField();
    tfBlue.setText("255");

    pGadgets = new Panel();
    pGadgets.setLayout(new GridLayout(1, 6, 5, 5));
    add(pGadgets);
    pGadgets.add(lRed);
    pGadgets.add(tfRed);
    pGadgets.add(lGreen);
    pGadgets.add(tfGreen);
    pGadgets.add(lBlue);
    pGadgets.add(tfBlue);

    myCanvas = new Canvas();
    myCanvas.setBackground(new Color(0,0,0));
    myCanvas.setBounds(0, 0, 600, 400);

    add(myCanvas);
    myCanvas.addMouseMotionListener(new MouseMotionListener() {

        public void mouseMoved(MouseEvent e) {
            // TODO Auto-generated method stub

        }

        public void mouseDragged(MouseEvent e) {
            // TODO Auto-generated method stub
            paint(g);

        }
    });


  }

  public void paint(Graphics g) {
      g.setColor(Color.green);
      g.fillOval(mosX, mosY, 30, 30);

      }





}

Upvotes: 1

Views: 183

Answers (2)

no.good.at.coding
no.good.at.coding

Reputation: 20371

Two things:

public void mouseDragged(MouseEvent e) 
{
   mosX = e.getX();
   mosY = e.getY();
   repaint(); //NOT paint(g);
}

//...
public void paint(Graphics g) 
{
    //draw on the canvas not on the component 
    //since the canvas gets drawn over it
    Graphics g2 = myCanvas.getGraphics();
    g2.setColor(Color.green);
    g2.fillOval(mosX, mosY, 30, 30);
}

If you have anything more complex, you should subclass Canvas and override it's paint() method.

Upvotes: 4

Swaranga Sarma
Swaranga Sarma

Reputation: 13433

Try this:

public void mouseDragged(MouseEvent e) 
{
    mosX = e.getX();
    mosY = e.getY();

    repaint();
}

The problem was that you were not updating your coordinates for the mouseDragged event. Also instead of calling paint() directly, you should call repaint(). Calling repaint() will ensure your paint() is called automatically.

EDIT:

To paint on Canvas object, override paint() of the Canvas object.

myCanvas = new Canvas()
{
    public void paint(Graphics g) 
    {
        g.setColor(Color.green);
        g.fillOval(mosX, mosY, 30, 30);
    }    
};

Now your mouseDragged method becomes :

public void mouseDragged(MouseEvent e) 
{
    mosX = e.getX();
    mosY = e.getY();

    myCanvas.repaint();
}

Upvotes: 1

Related Questions