Java 内部类JPanel的奇怪东西
我试图重写内部类JPanel中的方法paintComponent并绘制一些图片。但如果我在构造函数中加载image,则不会调用方法paintComponent。若在主类中加载图像,则一切正常。这是怎么一回事?这是代码,不起作用Java 内部类JPanel的奇怪东西,java,image,swing,jframe,jpanel,Java,Image,Swing,Jframe,Jpanel,我试图重写内部类JPanel中的方法paintComponent并绘制一些图片。但如果我在构造函数中加载image,则不会调用方法paintComponent。若在主类中加载图像,则一切正常。这是怎么一回事?这是代码,不起作用 import java.awt.Graphics; import java.awt.Image; import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JPanel; pu
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写了“构造器”和“画图”
我无法理解这一点。)您的“问题”是主构造函数中语句的顺序
首先,您正在构建一个新框架。其次,将其设置为可见。此时将绘制它,并在其关联的面板上调用绘制方法。在这一点上,也没有关联的面板。第三,构建一个新的JPanelExt并将其添加到框架中。这不会导致重新绘制框架
打电话
window.setVisible(true);
在施工过程结束时。然后,您将看到您的图像。首先在最后一帧上调用
setVisible
,并使用适当的布局管理器。您还应该查看。此外,请参考此,而不是提供绝对路径
,以便将图像添加到应用程序中。这也是一小时的需要,它还需要被赋予权重,即将所有内容放入main方法中,如EventQueue.invokeLater(new Runnable(){public void run(){/*这里是main*/})代码>,连同当前信息,+1非常感谢!但是为什么第二个变体可以工作并调用paintComponent?@user2588825:因为在您将flower1
添加到它之前,您的窗口已经可见,因此repaint()
调用只会在您最小化窗口或拖动到inc/dec
它的大小时发生。这就是为什么它被认为是一种好的做法,首先将所有组件添加到父容器中,然后使其可见,而不是在此之前:-)@user2588825:如果前面的方法不起作用,那么我想,在其当前形式中,您必须调用flower1.revalidate()和flower1.repaint()
,作为主方法的最后一行。。。