是否在创建JFrame时调用paint()方法?

时间:2015-06-11 16:47:27

标签: java swing

我对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());
    }
}

4 个答案:

答案 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编程期间,断点是必不可少的。

示例:

enter image description here

参考:

根据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);)重叠。