1

我试图在内部类 JPanel 中覆盖方法paintComponent 并绘制一些图片。但是,如果我在构造函数中加载图像,则不会调用方法 paintComponent。如果在主类中加载图像,一切都很好。它是什么?这是代码,这不起作用

import java.awt.Graphics;
import java.awt.Image;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Main {
JFrame window;
//Image image=new ImageIcon("D://domik.png").getImage();

class JPanelExt extends JPanel {
    Image image;

    public JPanelExt (){            
    image=new ImageIcon("D://domik.png").getImage();
    System.out.println("constructor");          
    }

    @Override
    public void paintComponent(Graphics g) {            
        super.paintComponent(g);
        System.out.println("paint");
        g.drawImage(image, 0, 0, this);
        g.drawRect(0, 400, 100, 100);       
    }   
}       

public Main(){

    window=new JFrame("Flowers");
    window.setSize(430, 480);
    window.setVisible(true);
    window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);                      
    JPanelExt flower1 =new JPanelExt();
    flower1.setBounds(100, 100, 200, 200);
    flower1.setToolTipText("House");                
    window.setLayout(null);             
    window.add(flower1);                
}   
public static void main(String[] args) {

    Main main=new Main();       
}
}

而 sysout 只写“构造函数”

但是如果我以这种方式更改代码

public class Main {
JFrame window;
Image image=new ImageIcon("D://domik.png").getImage();

class JPanelExt extends JPanel {
    //Image image;

    public JPanelExt (){

    //image=new ImageIcon("D://domik.png").getImage();
    System.out.println("constructor");
             }

    @Override
    public void paintComponent(Graphics g) {

        super.paintComponent(g);
        System.out.println("paint");
        g.drawImage(image, 0, 0, this);
        g.drawRect(0, 400, 100, 100);

    }

并且 sysout 写“constructor”、“paint”

我无法理解这个))

4

1 回答 1

3

您的“问题”是 Main 构造函数中语句的顺序。

首先,您正在构建一个新框架。其次,您将其设置为可见。此时,它被绘制并在其关联面板上调用绘制方法。同样在这一点上,没有关联的面板。第三,构造一个新的 JPanelExt 并将其添加到框架中。这不会导致重新绘制框架。

拨打电话

window.setVisible(true);

在施工过程结束时。然后你会看到你的形象。

于 2013-07-17T06:27:34.160 回答