首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java Mousepress()绘制图像

Java Mousepress()绘制图像
EN

Stack Overflow用户
提问于 2016-05-07 23:54:45
回答 1查看 51关注 0票数 0

我创建它是为了当鼠标按下鼠标的x和y坐标时绘制一条鱼。但是我似乎并没有调用drawfish方法。我找不到它不工作的原因。如果有任何帮助,我将不胜感激。

代码语言:javascript
复制
  /*FishTank*/
  import java.awt.Graphics;
  import javax.swing.JComponent;
  import javax.swing.JFrame;
  import java.awt.event.*;
  import javax.swing.*;
  import java.awt.*;
  import java.awt.geom.*;
  /*FishTank class-contains a frame and the WinstonCanvas.*/
  public class FishTank{

    public static void main ( String[] args ){
      javax.swing.SwingUtilities.invokeLater(new Runnable(){
  public void run(){
          JFrame window = new JFrame();
          window.setTitle("Fish Tank");
          window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
          window.setBounds(30, 30, 700, 430);
          window.getContentPane().add(new FishTankCanvas());
          window.setVisible(true);
        }
      });
    }
  }
  /*FishTankCanvas is a component that allows drawing shapes.*/
  class FishTankCanvas extends JComponent {
    static Graphics2D g;
    int x = 11;
    Timer myTimer;
    public FishTankCanvas(){
      myTimer = new Timer (2, new ActionListener(){
        public void actionPerformed (ActionEvent evt){
          repaint();
        }
      });
      myTimer.start();
    }

    public void paint(Graphics graphics) {
      g = (Graphics2D)graphics;
      //makes the background white
      Color backgroundColor = new Color(89, 216, 255);//light blue
      g.setColor(backgroundColor);
      g.fillRect(0,0,this.getWidth(),this.getHeight());

      //  drawfish (Graphics graphics, int bodyX, int bodyY, int            bodyLength,int bodyHeight, int tailwidth, int eyesize,int tailcolor, int bodycolor)

      // Mouselistener and mouseadapter  
      this.addMouseListener (new MouseAdapter() {
        public void mousePressed(MouseEvent e) {  
          //call drawfish method
          drawfish(FishTankCanvas.g,e.getX(), e.getY(),118,74,1,((int)            (Math.random()*(4 - 0))));
          repaint();
        }
      });

      // x coordinate plus 1 of fish (animate)
      x= x + 1; 
    }
    // drawfish method
    public void drawfish(Graphics graphics, int bodyX, int bodyY, int       bodyLength,int bodyHeight,int tailcolor, int bodycolor ){

      Graphics2D g = (Graphics2D)graphics;
      bodyX +=x;
      //colours
      Color[] colours= new Color[5];
      colours[0] =  new Color(0, 0, 0);//black
      colours[1] = new Color(162, 0, 255);//purple
      colours[2] = Color.red;//red
      colours[3] = new Color(255,255,0);// yellow
      colours[4] = new Color(60,179,113);//green

      //draw fish
      // body
      g.setColor(colours[bodycolor]);
      g.fillOval(bodyX, bodyY, bodyLength, bodyHeight);
      // tail
      g.setColor(colours[tailcolor]);
      int tailWidth = bodyLength/4;
      int tailHeight = bodyHeight/2;
      int[] tailPointx = new int[3];
      int[] tailPointy = new int[3];
      tailPointx[0]=bodyX;
      tailPointy[0]=bodyY+bodyHeight/2;
      tailPointx[1]=bodyX-tailWidth;
      tailPointy[1]=bodyY+bodyHeight/2-tailHeight;
      tailPointx[2]=bodyX-tailWidth;
      tailPointy[2]=bodyY+tailHeight+tailHeight;
      g.fillPolygon(tailPointx, tailPointy, 3);
      // eye
      g.setColor(colours[0]);
      g.fillOval(bodyX+3*bodyLength/4, bodyY+bodyHeight/2-bodyHeight/5,          bodyHeight/5, bodyHeight/5);      
    }
  }      
EN

回答 1

Stack Overflow用户

发布于 2016-05-08 00:01:29

那么,

方法似乎没有被调用。

好的,这很容易验证。您所需要做的就是将调试代码添加到方法中,以确定这是否为真。然后,您可以告诉我们这是否是问题所在,而不是猜测。

其他问题:

  1. 不要将MouseListener添加到绘制方法中的组件。侦听器应该被添加到你的类的构造函数中。
  2. 不要重写paint()。自定义绘制是通过重写paintComponent()方法来完成的。别忘了调用super.paintComponent(...).
  3. Extend JPanel而不是JComponent。然后,您可以只使用setBackground()方法来绘制背景。

然而,真正的问题是,当你点击鼠标时,鱼可能会被画出来,但随后计时器会重新绘制,这将在2毫秒后清除面板,所以你永远看不到鱼。把定时器扔掉。不需要计时器来绘制一条鱼。

假设你想绘制多条鱼,你需要跟踪你点击的每一个地方,然后绘制所有的鱼。有两种方法可以做到这一点:

  1. 保存你想要绘制鱼的点的ArrayList,然后在你的绘制方法中迭代这个列表
  2. 当鼠标点击时在BufferedImage上绘制鱼,然后只绘制图像。

有关这两种方法的工作示例,请参阅Custom Painting Approaches

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37090592

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档