Java:Image赢得';在调整窗口大小之前,我不会显示

Java:Image赢得';在调整窗口大小之前,我不会显示,java,image,user-interface,resize,jpanel,Java,Image,User Interface,Resize,Jpanel,我正在用java编程,我正在学习GUI和图形。在我的程序中,我在JPanel上绘制了一个图像,并将JPanel添加到主窗口中。我遇到的问题是,当我运行程序时,直到我手动调整窗口大小,图像才会显示。以下是相关代码: 在绘制图像的位置: public class painting extends JPanel{ public void paintComponent(Graphics g){ super.paintComponent(g); this.setBa

我正在用java编程,我正在学习GUI和图形。在我的程序中,我在JPanel上绘制了一个图像,并将JPanel添加到主窗口中。我遇到的问题是,当我运行程序时,直到我手动调整窗口大小,图像才会显示。以下是相关代码:

在绘制图像的位置:

public class painting extends JPanel{
    public void paintComponent(Graphics g){
        super.paintComponent(g);
        this.setBackground(Color.WHITE);
        g.drawImage(Toolkit.getDefaultToolkit().getImage("image.png"), 0, 0, null);
    }
}
其中,将JPanel添加到JFrame(c是GridBagConstraints):

设置窗口的位置:

public class MainC{
    public static void main (String args[]){
        GUI gui = new GUI();
        gui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        gui.pack();
        gui.setVisible(true);
        gui.setTitle("Title");
    }
}
谢谢, 贝内特

编辑:我注意到它有时会正确地显示图像,但如果我关闭程序并重试,它将无法工作,直到我调整它的大小


EDIT2:以下是文件,

GUI
构造函数中,您应该先调用super()

并动议:

gui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
gui.pack();
gui.setVisible(true);
gui.setTitle("Title");
在GUI构造函数中。

执行

Toolkit.getDefaultToolkit().getImage("image.png")
给你带来照片了吗?
我试了一下:

public class Gui extends JFrame{
public Gui() {
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.setLayout(new BorderLayout());
    this.setBounds(100, 100, 300, 300);
    JPanel pnl = new JPanel(){
        public void paintComponent(Graphics g){
            super.paintComponent(g);
            this.setBackground(Color.WHITE);
            try {
                g.drawImage(new Robot().createScreenCapture(new Rectangle(90, 90)), 0, 0, null);
            } catch (AWTException e) {
                e.printStackTrace();
            }
        }
    };
    getContentPane().add(pnl, BorderLayout.CENTER);
}
public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            new Gui().setVisible(true);
        }
    });
}

它是有效的。

您的问题一定在代码的其他地方。我将您的三个类复制并粘贴到我的IDE中。我唯一改变的是在GUI.java中添加了
setLayout(newgridbaglayout())
GridBagConstraints c=新的GridBagConstraints(),我将图像的位置更改为我自己的位置。窗口按预期工作,图像立即显示


我假设这里没有显示其他代码,比如我添加的c的初始化。检查其他代码,确保最初没有在图像上重新绘制。另外,如果您发布其他代码,我可以帮助您确定问题所在。

Toolkit.getImage()
异步工作。使用
ImageIO.read()
或添加一个
MediaTracker

我试过了,但仍然不起作用。我可以让Jframe和JPanel显示,但图片没有显示。@Giggums先生,调用
挫折背景(…)
的目的是什么?另外,您不应该在
paintComponent(…)
中加载图像。您可能希望尝试使用事件调度线程。要更快获得更好的帮助,请发布一个。不过请注意,如果您执行mre和我自己提供的建议,我怀疑问题会得到解决。我最终使用ImageIO.read()使其正常工作。谢谢大家对我的帮助。为了扩展Chris的建议,请确保在EDT上创建并更新GUI元素。不这样做可能会导致偶尔出现渲染错误和异常。
main(String[])
显然是在构建脱离EDT的GUI。有关更多详细信息,请参阅。是的Toolkit.getDefaultToolkit().getImage(“image.png”)将为我提供图片。我确实初始化了c,我的绘画类中没有更多代码,但GUI构造函数中有更多代码。但据我所知,这并没有把事情搞砸。我也可以让它每隔一段时间工作一次,但是当我关闭窗口并重试时,它就不工作了。你介意发布你所有的代码吗?我现在不能重现你的问题,所以很难调试。代码现在在我的主要帖子底部的链接中。很高兴你把它整理好了+1用于报告。+1用于描述问题和制定实际解决方案。
public class Gui extends JFrame{
public Gui() {
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.setLayout(new BorderLayout());
    this.setBounds(100, 100, 300, 300);
    JPanel pnl = new JPanel(){
        public void paintComponent(Graphics g){
            super.paintComponent(g);
            this.setBackground(Color.WHITE);
            try {
                g.drawImage(new Robot().createScreenCapture(new Rectangle(90, 90)), 0, 0, null);
            } catch (AWTException e) {
                e.printStackTrace();
            }
        }
    };
    getContentPane().add(pnl, BorderLayout.CENTER);
}
public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            new Gui().setVisible(true);
        }
    });
}