【问题标题】:Class extends BufferedImage, but picture can't change. Any way around this?类扩展了 BufferedImage,但图片不能改变。有什么办法吗?
【发布时间】:2015-12-23 23:17:45
【问题描述】:

我正在尝试创建一个扩展 BufferedImage 的简单 Card 类,以便我可以直接在屏幕上绘制卡片。但是这张卡有两个面。前面,还有后面。我包括一个翻转(布尔面朝上)方法,我想将图像从一侧更改为另一侧,但似乎由于类扩展了 BufferedImage,它是最终的?我不确定,这是我的印象。它不会改变构造函数中绘制的原始图像。有什么办法可以让我仍然可以直接在屏幕上绘制卡片吗?这就是我目前所拥有的......

  public Card(int rank, int suit)
  {
     super(50,70,TYPE_INT_ARGB);
     this.rank = rank;
     this.suit = suit;
     try{bi = ImageIO.read(getClass().getResource(toString()+".png"));
     back = ImageIO.read(getClass().getResource("back.png"));}
     catch(IOException e){e.printStackTrace();}
     Graphics2D g = createGraphics();
     g.drawImage(back,0,0,null);
     g.dispose();
  }

  public void flip(boolean faceup)
  {
     this.faceup = faceup;
     Graphics2D g = createGraphics();
     if(faceup)g.drawImage(bi,0,0,null);
     else g.drawImage(back,0,0,null);
     g.dispose();
  }

【问题讨论】:

  • 虽然我通常不建议扩展BufferedImage(按照@camickr 的说法,创建一个包含两个图像的Card 类),但我确实认为您的方法可行。请记住,BufferedImages 在更改时不会重新绘制自己。调用flip() 后,您必须发出repaint()(假设是Swing 应用程序)。

标签: java graphics bufferedimage final extends


【解决方案1】:

不要扩展 BufferedImage。

相反,您的类可以包含两个 BufferedImage:

  1. 前面
  2. 背面

然后绘画方法将根据“翻转”属性绘制正面或背面。

【讨论】:

  • 我知道我可以做到,但我希望能够轻松地在屏幕上的任何位置绘制图像。如果它是一个组件,那么这样做对我来说会有点困难。除非您建议使用 getImage() 方法?我仍然想找到一种制作双面缓冲图像的方法。
  • 您可以使用 getRaster().getSample(x,y,c) 访问 BufferedImage 中的像素值,或者使用 DataBuffer 更快。
  • but I want to be able to easily draw the image anywhere on screen. 这就是 drawImage() 方法中的 x/y 值。
猜你喜欢
  • 2017-10-01
  • 2012-09-03
  • 2013-12-03
  • 2015-03-09
  • 1970-01-01
  • 1970-01-01
  • 2012-01-03
  • 1970-01-01
相关资源
最近更新 更多