我试图在内部类JPanel中覆盖方法paintComponent并绘制一些图片。但是,如果我在构造函数中加载图像,方法paintComponent不会调用。如果在主类中加载图像,则everythig就可以了。它是什么?这是代码,不起作用
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”
我无法理解这一点))
答案 0 :(得分:3)
您的“问题”是Main构造函数中语句的顺序。
首先,您要构建一个新框架。其次,您将其设置为可见。此时它被绘制并且还在其关联的面板上调用绘制方法。此时,还没有相关的面板。第三,构造一个新的JPanelExt并将其添加到框架中。这不会导致重新绘制框架。
拨打电话
window.setVisible(true);
在施工过程结束时。然后你会看到你的形象。