Ash*_*pta 2 java graphics inheritance swing
所以我正在尝试学习Java图形,这些代码让我感到困惑.我不明白这里有几件事:
paintComponenet两次使用方法的名称,因为我们从super(JPanel)调用一个方法?Graphics g,它不仅仅是一个对象的引用变量,Graphics因为我们没有将它设置为等于= new Graphics();?paintComponent调用方法?paintComponentJPanelpaintComponent获取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)
为什么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()或操作系统想要重新绘制窗口时,例如窗口是否已最小化并恢复.
你真的很想阅读图形教程:
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将是您需要覆盖的唯一方法