【问题标题】:JPanel paintComponent(...) doesnt workJPanel paintComponent(...) 不起作用
【发布时间】:2015-11-30 20:55:28
【问题描述】:

我的问题很容易解释:我想要一个/一些 JPanel,添加到 JFrame 中,用图像自己绘制。可悲的是最后一件事不起作用。供参考:图像路径正确,JPanel 大小与图像大小相同。 谢谢帮助:P

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

【问题讨论】:

  • 你能看到 jframe 中的 jpanel 吗? x,y 值是多少?如果您的面板和图像大小相同,那么 x,y 应该是 0
  • 正如@FastSnail 所说:你是如何使用这个类的?您如何测试图像实际上是否被正确读取?您是否尝试将图像显示为 JOptionPane 中显示的 ImageIcon?如果是这样,它有效吗?考虑在 JPanel 周围放置一个临时边框,以清楚地看到它的实际大小。请发帖minimal reproducible example
  • 就像代码中仍然显示的那样,我使用颜色测试了面板,所以面板可以工作。 :P 我像这样使用它们: yArray[i] = new PanelTerrain(new Grass(), 150 + (i * 8) , 50 + 8 * ycord);面板应该出现的位置的 x / y re。因此,经过颜色测试,一切正常。通过简单的 system.out.print() 测试图像(路径)。但是对于提示,将尝试 JOptionPane()

标签: java image swing paint


【解决方案1】:

我的第一个猜测是你传错了xy.xyg.drawImage是左上角的坐标,而不是图像的大小,所以通常它们直接设置为 0(即g.draWimage(imga, x, y, this)

【讨论】:

  • thx 很多,我现在不怎么错过 xD 我试图解决这个问题 2 天,但我在向面板添加图层时得到了类似的东西,但效果很好。但我真的忘记了(不要问我为什么)图像的坐标是基于面板本身的,而不是在框架 xD 上,所以我得到了一个大小为 8 x 8 的面板,但图像从右下角开始(看不见)thx alot xD(所以用 this.setBounds(x, y, 8, 8); 和 g.drawImage(imga, 0, 0, this); 它应该如何工作)
  • @SimonMaas 请考虑accepting 对您帮助最大的答案。
【解决方案2】:

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

我认为你应该这样做——假设你想要一个图像网格,比如地球、水、草……

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-22
    • 2021-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-09
    相关资源
    最近更新 更多