因此,首先我创建了一个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对象作为其参数,但是谁通过了这个因素我不是。
答案 0 :(得分:2)
我的问题是......
paintComponent
方法将Graphics2D对象作为它的参数,但是谁传递了这个因素我不是。
当在EDT上处理绘制事件时,绘画系统将其传入。
在很多方面,paintComponent
与其他事件处理程序(actionPerformed
,itemStateChanged
等)一样,因为您没有明确地调用它。系统准备传递给您的对象(在本例中为Graphics
)并在需要时调用它。
[如果]绘画请求来自第一个重量级祖先(通常是
JFrame
,JDialog
,JWindow
或JApplet
):
事件派发线程在该祖先上调用
paint()
Container.paint()
的默认实现在任何轻量级后代上递归调用paint()
[如果]绘画请求来自对
repaint()
扩展名javax.swing.JComponent
的调用:
JComponent.repaint()
向组件RepaintManager
注册一个异步重绘请求,该请求使用invokeLater()
对Runnable
进行排队,以便稍后在事件调度线程上处理请求runnable在事件调度线程上执行,并使组件的
RepaintManager
在组件上调用paintImmediately()
,该组件在根组件上调用paint()
(而paintComponent
由paint
调用。)
答案 1 :(得分:0)
图形对象起源于Java的GUI框架。您使用Java编程的任何* GUI应用程序都是基于此GUI框架构建的。因此,例如,您不必编写控制基本窗口外观的所有代码,控制GUI程序的启动方式,或控制用户通过外围硬件(即键盘和鼠标)进行交互的方式。处理。
Graphics对象只是Java附带的许多类中的一个,它们在您创建的GUI应用程序中实例化并传递给您,以使程序成为一个完整的GUI程序。
[*]从技术上讲,你可以编写一个不使用Java预构建GUI框架的GUI程序。但在大多数情况下,没有人这样做。