【问题标题】:Basic paintComponent not being called by repaint()?重绘()没有调用基本的paintComponent?
【发布时间】:2013-07-22 17:37:05
【问题描述】:

我正在使用Headfirst java这本书,并且我已经编写了一个我认为可以很好编译的程序。但是当创建窗口时,背景或椭圆没有出现。

import javax.swing.*;
import java.awt.*;

public class setup {  
  public static void main(String[] args) {    
    JFrame f = new JFrame();
    System.out.println("Created Frame");
    JPanel myJPan = new JPanel();
    System.out.println("Created Panel");

    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  
    f.setSize(300,300);
    System.out.println("Set Size");
    f.setLocationRelativeTo(null);  
    f.setContentPane(myJPan);  
    f.setVisible(true);
    System.out.println("Made Visible");
    myJPan.repaint();
  }


  // @Override  ???
  //  "protected void" ??
  public void paintComponent(Graphics g) {
      // super.paintComponent(); ???
      g.fillRect(0,0,300,300);
      System.out.println("painted");
      int red = (int) (Math.random()*255);
      int green = (int) (Math.random()*255);
      int blue = (int)(Math.random()*255);
      System.out.println("Got Random Colors");
      Color randomColor = new Color(red, green, blue);
      g.setColor(randomColor);
      System.out.println("Set Random Colors");
      g.fillOval(70,70,100,100);
      System.out.println("Filled Oval");
  }
}

【问题讨论】:

  • paintComponent 属于 JPanel myJPan 类而不是 setup
  • 您实际上并没有覆盖myJPanpaintComponent 方法。您只是在 setup 类中定义了一个 paintComponent 方法。
  • 如果您添加了 @Override 注释,编译器会告诉您您实际上并没有覆盖任何内容。
  • 那我需要做什么?我必须重写 myJPan 的paintComponent 方法吗?我想我不知道该怎么做

标签: java swing graphics paint


【解决方案1】:

查看我对this question 的回复。它提供了设置 JPanel 的正确方法的示例。

就像其他评论者/回答者所说,paintComponent 属于 JPanel 类。这对您来说意味着您需要创建一个扩展 JPanel 的类(我们称之为MyPanel)。 (注意:如果你在 eclipse 中,你可以为这个类创建一个新的 .java 文件,或者让它成为一个内部类,它应该可以工作)。

完成此操作后,只需从setup 类中删除paintCOMponent 方法,并将其粘贴到新的MyPanel 类中。

最后,在您的设置类中,创建一个MyPanel,而不是创建JPanel 对象。

基本上,这个MyPanel 对象是您自己的自定义JPanel 对象,可以为所欲为!这几乎就像魔术一样!

附带说明(希望这将有助于您将来更好地格式化您的代码),并希望更多经验的 Java 程序员会同意我的观点,我还建议您创建自己的自定义 JFrame 对象为出色地。仅针对这一点,您不会覆盖除constructor 之外的任何方法。相反,在您的constructor 中为这个自定义的JFrame,您将为窗口制定所有规范(例如您的setDefaultCloseOperation(JFrame.EXIT_ON_CLOSEsetSize(300,300) 调用)。这个constructor 也是您将在其中实例化您的MyPanel 对象(以及您窗口中的任何其他组件对象)并可能给它一些ActionListeners 的地方。

然后,在另一个类(例如您的 setup 类)中,有一个 main 方法,该方法有 1 行:一个实例化“JFrame”对象的方法。这将自动创建窗口。

哦,还有一件非常重要的事情:如果你想显示它,你必须在你的JFrame 上调用setVisible(true)。我不确定为什么要这样设置。

【讨论】:

  • 随时。就在几个月前,我还在为这个概念苦苦挣扎。
  • 另外,如果它确实回答了您的问题,您应该将其标记为答案
  • 建议您创建自己的自定义 JFrame 非常不理想:一般规则 (OO 101) 是仅在增强 xx 特性时才扩展 xx。 JFrame 的 xx-ness 是顶级容器。仅仅使用这些服务并不是扩展的理由。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-16
  • 1970-01-01
  • 2015-08-26
  • 1970-01-01
相关资源
最近更新 更多