Java GUI:JComponent类中的paintComponent方法

时间:2015-03-25 22:34:32

标签: java

因此,首先我创建了一个JFrame对象,然后是一个使用适当重写的paintComponent方法扩展JComponent的类。

最后,我将此类的对象添加到JFrame对象。

以下是供参考的代码:

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

public class MyFrame {

    public static void main(String[] args) {
        JFrame frame = new JFrame("My Frame");
        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
        frame.setSize(screenSize);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
        MyComponent comp = new MyComponent();
        frame.add(comp);
    }

}

class MyComponent extends JComponent {

    public void paintComponent(Graphics g) {
        Graphics2D g2 = (Graphics2D) g;
        Rectangle r = new Rectangle(0,0,100,100);
        g2.draw(r);
    }
}

我的问题是...... paintComponent方法将Graphics2D对象作为其参数,但是谁通过了这个因素我不是。

2 个答案:

答案 0 :(得分:2)

  

我的问题是...... paintComponent方法将Graphics2D对象作为它的参数,但是谁传递了这个因素我不是。

当在EDT上处理绘制事件时,绘画系统将其传入。

在很多方面,paintComponent与其他事件处理程序(actionPerformeditemStateChanged等)一样,因为您没有明确地调用它。系统准备传递给您的对象(在本例中为Graphics)并在需要时调用它。

摘自Painting in AWT and Swing

  

[如果]绘画请求来自第一个重量级祖先(通常是JFrameJDialogJWindowJApplet):

     
      
  • 事件派发线程在该祖先上调用paint()

  •   
  • Container.paint()的默认实现在任何轻量级后代上递归调用paint()

  •   
     

[如果]绘画请求来自对repaint()扩展名javax.swing.JComponent的调用:

     
      
  • JComponent.repaint()向组件RepaintManager注册一个异步重绘请求,该请求使用invokeLater()Runnable进行排队,以便稍后在事件调度线程上处理请求

  •   
  • runnable在事件调度线程上执行,并使组件的RepaintManager在组件上调用paintImmediately(),该组件在根组件上调用paint()

  •   

(而paintComponentpaint调用。)

答案 1 :(得分:0)

图形对象起源于Java的GUI框架。您使用Java编程的任何* GUI应用程序都是基于此GUI框架构建的。因此,例如,您不必编写控制基本窗口外观的所有代码,控制GUI程序的启动方式,或控制用户通过外围硬件(即键盘和鼠标)进行交互的方式。处理。

Graphics对象只是Java附带的许多类中的一个,它们在您创建的GUI应用程序中实例化并传递给您,以使程序成为一个完整的GUI程序。

[*]从技术上讲,你可以编写一个不使用Java预构建GUI框架的GUI程序。但在大多数情况下,没有人这样做。