Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 内部类JPanel的奇怪东西_Java_Image_Swing_Jframe_Jpanel - Fatal编程技术网

Java 内部类JPanel的奇怪东西

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

我试图重写内部类JPanel中的方法paintComponent并绘制一些图片。但如果我在构造函数中加载image,则不会调用方法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写了“构造器”和“画图”

我无法理解这一点。)

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

首先,您正在构建一个新框架。其次,将其设置为可见。此时将绘制它,并在其关联的面板上调用绘制方法。在这一点上,也没有关联的面板。第三,构建一个新的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()
,作为主方法的最后一行。。。