Java - JPanel上的paintComponents不起作用

3

我创建了一个继承了JFrame的类,并在其中添加了一个JPanel,但是paintComponents()方法没有在JPanel上绘制任何内容。下面是paintComponents()的代码,我选择使用了双重缓冲。

  public void paintComponents(Graphics graphics) {
     panel.paintComponents(graphics);

      bufferedImage = createImage(sizeX, sizeY);
      Graphics2D g = (Graphics2D) bufferedImage.getGraphics();


      for (ImageData myImage : imageData) {
        g.drawImage(myImage.getImage(), myImage.getX(), myImage.getY(), null);
    }

    graphics.drawImage(bufferedImage, 0, 0, null);
  }

这样做有什么问题吗?顺便说一句,我尝试了paint(),它可以工作,但我不认为这是正确的方法。

感谢你的时间。:)

2个回答

7
不要扩展顶层组件,如 JFrame。相反,保留一个框架实例,并向其添加面板。所有自定义绘画或组件添加都在面板中完成。
在面板中进行自定义绘画时,使用 paintComponent 方法(而不是 paintComponents),不要覆盖它。
其他提示:
- 记得调用 super.paintComponent(g);。这很重要,以确保边框和填充等被考虑在内。 - 将 null 替换为 this。每个 JComponent 都是一个 ImageObserver

正如我所说,我扩展了JFrame类,因此我不能执行super.paintComponent。 - Ewen
同时,paintComponent并不存在,只有paintComponents。 - Ewen
我必须这样做,因为这是为了KeyListener,panel.addKeyListener(this); - Ewen
@Ewen和Andrew建议从JPanel扩展。 - MadProgrammer
@MadProgrammer 答案在“框架”的基础更加清晰的情况下被显著编辑。我假设了一个基于标题“..paintComponents on a JPanel not working”的面板。老实说,我没有进一步阅读,只是从代码片段中确认了方法名带有s,然后提供了我的第一个答案:“去掉s”。;) - Andrew Thompson

2
请注意,JFrame不是JComponent!实际上,paintComponents(Graphics)方法从未被调用。修复方法是子类化JPanel,并将您的子类面板添加到框架作为内容窗格。在面板中覆盖paintComponents(Graphics)方法即可。

如何覆盖 paintComponents() 方法? - Ewen
你需要重写paint方法,或者更好的选择是使用JPanel并覆盖其paintComponent方法,将你现在在扩展的JFrame中所做的所有内容都放在里面。 - Daniel Mühlbachler-P.
"..在面板中覆盖paintComponent(Graphics)方法" - nachokk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接