什么是JPanel/Graphics方法paintComponent?

Ash*_*pta 2 java graphics inheritance swing

所以我正在尝试学习Java图形,这些代码让我感到困惑.我不明白这里有几件事:

  1. 为什么paintComponenet两次使用方法的名称,因为我们从super(JPanel)调用一个方法?
  2. 是什么Graphics g,它不仅仅是一个对象的引用变量,Graphics因为我们没有将它设置为等于= new Graphics();
  3. 为什么我班级中的方法名称必须从或超级paintComponent调用方法?paintComponentJPanel
  4. 我的类中的方法paintComponent获取Graphics对象的参数,但什么时候paintComponent甚至被调用,何时是Graphics插入的参数?

基本上我需要有人向我解释这段代码.

//note this is all in a class that extends JPanel, my JPanel is later placed in 
//a JFrame which is run through main
 public void paintComponent(Graphics g) 
        {
            int width = getWidth();             
            int height = getHeight();         

            super.paintComponent(g);   

            g.setColor(Color.RED);
            g.fillRect(10, 10, 200, 200); 
            g.setColor(Color.BLUE);
            g.drawRect(10, 10, 200, 200); 
        }
Run Code Online (Sandbox Code Playgroud)

Hov*_*els 6

为什么paintComponenet使用了两次,方法的名称和我们从super调用的方法(JPannel)

它没有被"使用"两次.它被覆盖了一次,但你想调用父(JPanel)类的超级方法,这样你就可以确保它自己做了一些内务画,包括绘制它的子节点并清除屏幕上的任何脏位.

什么是Graphics g,它不仅仅是Graphics对象的引用变量,因为我们没有将它设置为= new Graphics();

这是一个Graphics 参数.您没有设置它= new Graphics()因为JVM为您执行此操作.它在需要时调用幕后方法,并提供参数.

为什么我的类中的方法名必须是paintComponent来调用JPannel或super中的方法paintComponent

它必须覆盖super的方法,以便JVM在想要绘制GUI时调用正确的方法.

我的类paintComponent中的方法获取Graphics对象的参数,但是什么时候paintComponent甚至被调用,什么时候插入Graphics的参数.

同样,当您的程序要重新绘制GUI时,JVM会调用它,例如当您调用repaint()或操作系统想要重新绘制窗口时,例如窗口是否已最小化并恢复.

你真的很想阅读图形教程:


nIc*_*cOw 5

1)为什么paintComponenet使用了两次,作为方法的名称,我们称之为super(JPannel)的方法

这里的行super.paintComponent(...),意味着我们希望JPanel首先以通常的Java方式绘制(这通常取决于所述JComponent的opaque属性,如果它是真的,那么它就成了部分的责任程序员用完全不透明的颜色填充内容区域.如果是假的,那么程序员可以自由地保持不变.所以为了克服与这个合同相关的麻烦,使用了super.paintComponent(g),因为它遵守规则,并执行相同的任务,具体取决于opaque属性是true还是false.

2)什么是Graphics g,它不仅仅是Graphics对象的引用变量,因为我们没有将它设置为= new Graphics(); 4)我的类paintComponent中的方法获取Graphics对象的参数但是paintComponent什么时候被调用,什么时候插入Graphics的参数

paintComponent方法是放置所有绘画代码的地方.确实,当绘制时,将调用此方法,但绘制实际上从类层次开始,使用paint方法(由java.awt.Component定义.)此方法将由绘制子系统执行.组件需要呈现.它的签名是:

public void paint(Graphics g)
Run Code Online (Sandbox Code Playgroud)

javax.swing.JComponent扩展了这个类,并进一步将paint方法分解为三个单独的方法,这些方法按以下顺序调用:

protected void paintComponent(Graphics g)
protected void paintBorder(Graphics g)
protected void paintChildren(Graphics g)
Run Code Online (Sandbox Code Playgroud)

API不会阻止您的代码覆盖paintBorder和paintChildren,但一般来说,没有理由这样做.出于所有实际目的,paintComponent将是您需要覆盖的唯一方法