【问题标题】:Java - paintComponents on a JPanel not workingJava - JPanel 上的paintComponents 不起作用
【发布时间】:2012-08-17 19:27:48
【问题描述】:

我创建了一个扩展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() 并且成功了,但我认为这不是正确的方法。

感谢您的宝贵时间。 :)

【问题讨论】:

    标签: java swing jframe paintcomponent


    【解决方案1】:

    不要扩展顶级组件,例如 JFrame。而是保留一个框架的实例,并为其添加一个面板。所有自定义绘制或添加组件都在面板中完成。

    在面板中进行自定义绘制时,请在 paintComponent 方法中进行(not paintComponents 不要覆盖它)。

    其他提示

    • 记得拨打super.paintComponent(g);。这对于确保考虑到边框和填充等非常重要。
    • null 换成this。每个JComponent 都是ImageObserver

    【讨论】:

    • 正如我所说,我扩展了 JFrame 类,所以我不能做 super.paintComponent
    • 另外paintComponent不存在,只有paintComponents存在
    • 我必须,是给KeyListener,panel.addKeyListener(this);
    • @Ewen 和 Andrew 建议改为从 JPanel 扩展
    • @MadProgrammer 随着“框架”的基础变得更加清晰,答案变得非常重要。我假设一个面板基于标题 "..paintComponents on a JPanel not working"。老实说,除了从代码 sn-p 确认方法名称有 s 之外,我没有进一步阅读 - 我提供了我的第一个答案“删除 s”。 ;)
    【解决方案2】:

    请注意,JFrame 不是 JComponent!事实上,paintComponents(Graphics) 方法永远不会被调用。修复方法是将 JPanel 子类化并将子类化面板添加到框架中作为内容窗格。在面板中覆盖paintComponents(Graphics) 方法。

    【讨论】:

    • 如何覆盖paintComponents()?
    • 你需要重写paint方法,或者更好的选择是使用一个jpanel并用你现在在扩展的jframe中做的所有东西重写它的paintComponent方法。
    • "..在面板中覆盖paintComponent(Graphics)"应该是
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多