未调用 Paint 方法

Posted

技术标签:

【中文标题】未调用 Paint 方法【英文标题】:Paint Method is not Called 【发布时间】:2019-09-01 06:25:15 【问题描述】:

在上一帧创建实例后,我试图在下一帧设置背景图像,但结果,我刚刚看到调试结果,发现没有调用paint方法。据我所知,paint 方法是由 JFrame 类继承的,并且使用此逻辑,我已将其覆盖。正如我猜测的那样,发生逻辑错误的原因是我使用了事件处理程序并在 EventHandlerClass 中创建了实例。

    if(e.getActionCommand().equals(ButtonTo))       
        if(idString.equals("USER"))
                                       
                    
                        if("1234".equals(pwSt))     
                        
                            System.out.println("Wellcome");
                            if(gs==null)
                            
                                gs=new GameStart();
                            
                        
                    else
                    
                         System.out.println("Confirm your password");
                                   
                               
                

这是一个代码,如果执行一个动作,它将创建一个实例(gs)。完成此操作后,我注意到该实例已用于制作新的控制台框架。

class GameStart extends JFrame 
    private Image screenImage;
    private Graphics screenGraphic;
    private Image introBackgroundImage;
    private ImageIcon img;

    GameStart()
    
        JFrame jf=new JFrame("Game Set");
        jf.setBounds(300, 300, 400, 200);
        jf.setLayout(new BorderLayout());

        JButton bt1=new JButton("Start");
        JButton bt2=new JButton("Exit");    
        JPanel panel1=new JPanel();
        panel1.add(bt1);panel1.add(bt2);

        setContentPane(panel1);

        jf.add(panel1, BorderLayout.SOUTH);
        bt1.addActionListener(new Choice());
        bt2.addActionListener(new Choice());
        jf.setVisible(true);    
        img=new ImageIcon("./Images/backGroundImage.jpg");
        System.out.println("1");
    

    public void paint(Graphics g) 
        screenImage=createImage(200, 200);  
        screenGraphic=screenImage.getGraphics();
        screenDraw(screenGraphic);
        g.drawImage(screenImage, 0, 0, null);
        System.out.println("2");
    

    public void screenDraw(Graphics g) 
       
        this.repaint();
        System.out.println("3");
    

现在,通过制作一个框架和一些按钮,我希望显示所有表示结果的数字(1、2、3),但只是做了数字 1。

【问题讨论】:

不要覆盖 JFrame 上的paint()。自定义绘画是通过覆盖 JPanel 的 paintComponent(...) 来完成的,然后将面板添加到框架中。阅读 Custom Painting 上的 Swing 教程中的部分,了解更多信息和工作示例,以帮助您入门。您还可以查看Background Panel,这是一个可用于轻松将图像显示为背景的类。 您能否充实您的代码示例?特别是,您有一个 if 语句,它应该在一个类内部的方法中。 “在前一帧中”见The Use of Multiple JFrames, Good/Bad Practice? 请发帖minimal reproducible example,包括createImage()不要paint内部调用repaint 【参考方案1】:

您的代码中有一些我一眼就能看出的错误:

    您正在扩展 JFrame,但您并未向其添加任何额外功能,请参阅:Extends JFrame vs. creating it inside the program。相反,构建您的 GUI 以使用 JPanels 并覆盖他们的 paintComponent(...) 方法而不是 paint(...) 方法。

    您正在打破油漆链:完成上述操作后,在 paintComponent() 中调用 super.paintComponent(...)

也许还有其他人,但我目前很忙,无法测试您的代码,但上面的那些应该有助于解决您的问题。

【讨论】:

以上是关于未调用 Paint 方法的主要内容,如果未能解决你的问题,请参考以下文章

未调用 QGraphicsItem 绘制

Java 的 JPanel 子类中重写父类的 paint 方法 会被自动调用,请问调用的条件或时机

JAVA中paint()是自动执行的吗?

调用Qpainter的方法paint刷新图像并改变颜色

java中paint()的具体用法是啥?

窗口未显示 WM_PAINT 中的线条