我对java中的GUI很新,但我使用的教程我理解了所有内容,直到我做到这一点: 当我运行这段代码时,我得到一个带有椭圆的框架(就像我想要的那样)但是什么时候调用paint方法?
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Game extends JPanel {
public void paint(Graphics g) {
Graphics2D g2d = (Graphics2D) g;
g2d.drawOval(0, 0, 30, 30);
g2d.fillOval(0, 0, 30, 30);
}
public static void main(String[] args) {
JFrame frame = new JFrame("Single Player");
frame.setSize(300,300);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new Game());
}
}
答案 0 :(得分:3)
在setVisible(true)
方法中也可以看到here
让我更清楚一点。我必须承认,我低估了paint(Graphics g)
的来电次数。我知道它被repaint()
调用很多,通常这种方法只有在setVisible(true)
之后才有意义。这是一个粗略估计,而repaint()
甚至没有直接调用paint(Graphics g)
。
这就是说,你总是可以在你的IDE中查找方法的调用层次结构(在Eclipse中它肯定是可能的,我还没有尝试过其他方法)。要做到这一点,你只需要调用方法或在超类中覆盖它,例如您的代码中的行frame.paint(frame.getGraphics());
会执行(您想知道它在哪里调用的方法),您可以从弹出菜单中选择打开调用层次结构来查看每个直接调用,并递归地查看调用的方法的位置这些方法被称为等......
答案 1 :(得分:1)
Java在构造函数之后自动调用paintComponent()
方法。
你可以根据你想要做的事情在另一个函数/动作中手动调用repaint()
方法(如果你想在之后画一些东西)。
尽量在paint()方法中调用super.paintComponent(g);
。
答案 2 :(得分:1)
当swing必须绘制组件时调用它。您可以在eclipse调试模式下使用断点来了解代码流的工作原理。您可以在我的图像中看到调试点的使用(左侧是蓝色)。在代码的这一部分中,您可以通过在它旁边放置一个断点来发现它在import com.sun.jna.Native;
import com.sun.jna.platform.win32.*;
import com.sun.jna.win32.W32APIOptions;
public class ProcessList {
public static void main(String[] args) {
WinNT winNT = (WinNT) Native.loadLibrary(WinNT.class, W32APIOptions.UNICODE_OPTIONS);
WinNT.HANDLE snapshot = winNT.CreateToolhelp32Snapshot(Tlhelp32.TH32CS_SNAPPROCESS, new WinDef.DWORD(0));
Tlhelp32.PROCESSENTRY32.ByReference processEntry = new Tlhelp32.PROCESSENTRY32.ByReference();
while (winNT.Process32Next(snapshot, processEntry)) {
//see if your process is open and update your counter
}
winNT.CloseHandle(snapshot);
}
}
方法中被调用。在GUI编程期间,断点是必不可少的。
示例:
参考:
根据API文档:由Swing调用以绘制组件。应用程序不应直接调用paint,而应使用repaint方法来调度组件以进行重绘。
此方法实际上将绘制工作委托给三个受保护的方法:paintComponent,paintBorder和paintChildren。他们按照列出的顺序调用,以确保孩子出现在组件本身之上。一般来说,组件及其子组件不应在分配给边框的insets区域中绘制。子类可以像往常一样覆盖此方法。一个只想专门化UI(外观)委托的paint方法的子类应该只覆盖paintComponent。
答案 3 :(得分:0)
paint()
类(扩展Game
)添加到JPanel
时,会调用 JFrame
方法。因为您正在游戏类中扩展JPanel。因此,Game
类扩展了JPanel
,此JPanel
具有paint()
方法
因此,在此声明中调用了您的paint()
方法。
frame.add(new Game());
当您想在窗口中自己绘制某些内容时,会调用paint()
。当您调用paint()
方法时,窗口将绘制您在paint()
方法中定义的项目。因此,paint()
方法中的代码在窗口中显示两个项目,因为您试图在paint()
方法中绘制这两个项目
g2d.drawOval(0, 0, 30, 30);
g2d.fillOval(0, 0, 30, 30);
因此,您的paint()
方法在位置x = 0和y = 0点处绘制一个椭圆,高度为30和30度,之后您的paint()
方法在位置x = 0处绘制一个填充的椭圆并且y = 0,高度为30,重量为30。因此,您只能在窗口中看到填充的椭圆(fillOval(0, 0, 30, 30);
),该椭圆与前一个椭圆(drawOval(0, 0, 30, 30);
)重叠。