2015-09-04 56 views
1

我的问题很容易解释:我想要一个/一些JPanels,添加到JFrame中,用图像绘制自己。可悲的是,最后一件事情是行不通的。对于信息:图像路径是正确的,并且JPanel大小与图像大小相同。 THX求助:PJPanel paintComponent(...)does not work

package frames; 

import java.awt.FlowLayout; 
import java.awt.Graphics; 
import java.awt.Image; 
import javax.swing.ImageIcon; 
import javax.swing.JPanel; 
import world.Terrain; 

public class PanelTerrain extends JPanel { 
private Image img; 
private int x; 
private int y; 
private Image imga; 

    public PanelTerrain(Terrain terra, int x, int y) { 
     imga = new ImageIcon(terra.getPath()).getImage(); 
     this.x = x; 
     this.y = y; 
     this.setBounds(x, y, 8, 8); 
     //this.setBackground(terra.getColor()); 
    } 

    public void changeTerrain(Terrain t) 
    { 
     this.setVisible(false); 
     this.setBackground(t.getColor()); 
     this.setVisible(true); 
    } 

    @Override 
    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     g.drawImage(imga, x, y, this); 
    }     
} 
+1

你能看到jframe中的jpanel吗?什么是x,y值?如果你的面板和图像大小相同,那么x,y应该是0 –

+1

正如@FastSnail所述:你如何使用这个类?你如何测试图像实际上是正确读取的?您是否尝试将图像显示为JOptionPane中显示的ImageIcon?如果是这样,它工作吗?考虑在JPanel周围放置一个临时边界,以便清楚地看到它的实际大小。请发布[mcve]。 –

+0

像仍然在代码中呈现,我使用颜色测试面板,所以面板的作品。 :P 我使用它们: yArray [i] = new PanelTerrain(new Grass(),150 +(i * 8),50 + 8 * ycord); 面板应该出现的位置的x/y re。所以,用颜色进行测试,一切都像它应该的样子。通过一个简单的system.out.print()测试图像(路径)。但thx的提示,将尝试一个JOptionPane() –

回答

5

我的第一个猜测是,你正在传递g.drawImage错误xy.xy是左上角的坐标,图像的体积不大,所以通常它们都是直接设置为0(也就是说,g.draWimage(imga, x, y, this)

+0

好的答案。 1+ –

+0

thx很多,我现在不知道我是如何错过了xD我试图解决这个问题2天现在wile我有类似的东西在添加图层面板whcih工作正常。但我真的忘了(不要问我为什么),图像的坐标是基于面板本身,而不是在框架xD,所以我得到了一个8乘8的面板,但一个图像从右下角开始( (x,y,8,8);和g.drawImage(imga,0,0,this);它的工作方式应该如何工作) –

+2

@SimonMaas请考虑[接受](http://meta.stackexchange.com/a/5235)帮助你的答案最多。 –

2

一个很大的问题是你可能会滥用边界和x和y,你在JPanel上调用setBounds(要避免),然后绘制图像在某些x和y中,极有可能超出了JPanel的有限大小,不要这样做秒。如需更完整的帮助,请创建并发布您的Minimal, Complete, and Verifiable example

这是我认为你应该做的,而不是 - 假设你想图像的网格,有人说地球,一些水,一些草,...的

  • 创建基本图像ImageIcons ,一个图标为草,一个为水,等等......
  • 创建一个使用GridLayout的JPanel,并用JLabels的网格填充它。
  • 将这些相同的JLabel放入JLabel的二维数组中。
  • 通过在JLabel上调用setIcon(newIcon)来在需要更改图像的位置和时间交换标签图标。

例如,请参阅this answer of mine to a similar question以及其他同一问题的答案。