【问题标题】:Problem with drawing绘图有问题
【发布时间】:2011-04-10 17:31:22
【问题描述】:

现在下面的代码应该在黑色画布上绘制一个 onMouseDragged 圆圈。 不幸的是它没有(= 我错过了什么吗?

提前谢谢...

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

      }





}

【问题讨论】:

  • 感谢“编辑”。代码未按预期显示。
  • 看起来不像 mosXmosY 设置在任何地方。
  • 更改为:public void mouseDragged(MouseEvent e) { // TODO 自动生成的方法 stub mosX = e.getX(); mosY = e.getY();油漆(g); }还是什么都没有……
  • 不要使用应在内部使用的paint()。你应该打电话给repaint()。就像现在一样,您使用null 调用paint(),因为g 永远不会被设置。
  • 另外,请参阅我的回答。你想在画布上绘制,而不是在组件上

标签: java graphics applet drawing


【解决方案1】:

两件事:

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

如果你有更复杂的东西,你应该继承 Canvas 并覆盖它的 paint() 方法。

【讨论】:

    【解决方案2】:

    试试这个:

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

    问题是您没有更新mouseDragged 事件的坐标。此外,您应该调用repaint(),而不是直接调用paint()。调用repaint() 将确保您的paint() 被自动调用。

    编辑:

    要在 Canvas 对象上绘画,请覆盖 Canvas 对象的 paint()

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

    现在你的 mouseDragged 方法变成了:

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

    【讨论】:

    • 现在它会更新坐标。但这一切仍然发生在 myCanvas 背后。虽然我将我的听众添加到了 Canvas。
    • @bodycount PP,您可能必须为此使用JLayeredPane。你也可能需要g.fillOval((int)myCanvas.getLocation().getX()+ mosX, (int) myCanvas.getLocation().getY()+ mosY, 30, 30);
    • @bodyCountPP 您想在画布上绘制,而不是在组件上。请参阅我的更新答案。
    猜你喜欢
    • 1970-01-01
    • 2013-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多