Java 为什么';这个小程序不能工作/显示图像吗?

Java 为什么';这个小程序不能工作/显示图像吗?,java,swing,applet,Java,Swing,Applet,我是小应用程序的新手,正在尝试熟悉一些基本知识,比如如何在一个小应用程序中显示jpg图像。我已经阅读了关于applet的Java教程的相关部分,我不明白为什么这不起作用,我得到的只是一个空白applet区域。“/cards/as.jpg”-该文件存在于运行小程序的目录的子目录中。有人能看出我做错了什么吗?我不知所措 import javax.swing.JApplet; import javax.swing.JPanel; import javax.swing.SwingUtilities;

我是小应用程序的新手,正在尝试熟悉一些基本知识,比如如何在一个小应用程序中显示jpg图像。我已经阅读了关于applet的Java教程的相关部分,我不明白为什么这不起作用,我得到的只是一个空白applet区域。“/cards/as.jpg”-该文件存在于运行小程序的目录的子目录中。有人能看出我做错了什么吗?我不知所措

import javax.swing.JApplet;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class TestApplet extends JApplet {
    public void init() {
        try {
            SwingUtilities.invokeAndWait(new Runnable() {
                public void run() {
                    createGUI();
                }
            });
        }
        catch (Exception e) {
            System.err.println("createGUI didn't complete successfully");
        }
    }

    private void createGUI() {
        JPanel newContentPane = new JPanel();

        ImageComponent card = new ImageComponent();
        card.setImage(getCodeBase() + "/cards/as.jpg");

        newContentPane.add(card);        

        newContentPane.setOpaque(true);
        setContentPane(newContentPane);
    }
}


import java.awt.*;
import javax.swing.JComponent;
import javax.imageio.*;
import java.net.*;
import java.io.*;

/**
   A component that draws an Image.
*/
public class ImageComponent extends JComponent {  
    private Image image;
    private String url;

    public ImageComponent() {
        image = null;
        url = null;
    }

    public void setImage(String urlCardName) {
        url = urlCardName;
        if (url != null) {
            try {
                image = ImageIO.read(new URL(url));
            }
            catch (IOException e)
            {
                e.printStackTrace();
            }
        }
        else {
            image = null;
        }
        this.repaint();
    }

    public void paintComponent(Graphics g) { 
        if (image == null) return;
        // draw the images in the upper-left corner of the component
        g.drawImage(image, 0, 0, null);
    }
}

我想这是你的布局。通常情况下,contentPane默认使用BorderLayout,但当您将自己的JPanel用作contentPane时,您使用的是JPanel默认布局,即FlowLayout,使用FlowLayout添加到容器中的组件不会像使用BorderLayout那样展开以填充容器。查看渲染时ImageComponent的大小——我敢打赌它非常小,甚至是0大小

解决方案是使用小程序中已存在的contentPane及其默认BorderLayout,或者如果必须使用自己的JPanel,则为其提供BorderLayout并添加新的ImageComponent BorderLayout.CENTER。例如:

    JPanel newContentPane = new JPanel();

    newContentPane.setLayout(new BorderLayout()); // *** added this

    ImageComponent card = new ImageComponent();
    card.setImage(getCodeBase() + "/cards/as.jpg");

    newContentPane.add(card, BorderLayout.CENTER);  // *** changed

我想这是你的布局。通常情况下,contentPane默认使用BorderLayout,但当您将自己的JPanel用作contentPane时,您使用的是JPanel默认布局,即FlowLayout,使用FlowLayout添加到容器中的组件不会像使用BorderLayout那样展开以填充容器。查看渲染时ImageComponent的大小——我敢打赌它非常小,甚至是0大小

解决方案是使用小程序中已存在的contentPane及其默认BorderLayout,或者如果必须使用自己的JPanel,则为其提供BorderLayout并添加新的ImageComponent BorderLayout.CENTER。例如:

    JPanel newContentPane = new JPanel();

    newContentPane.setLayout(new BorderLayout()); // *** added this

    ImageComponent card = new ImageComponent();
    card.setImage(getCodeBase() + "/cards/as.jpg");

    newContentPane.add(card, BorderLayout.CENTER);  // *** changed
查看渲染时ImageComponent的大小——我敢打赌它非常小,甚至是0大小

这是因为您从未为组件设置首选尺寸

真正的问题是你为什么要自己画这幅画。不需要创建自定义组件。只需使用带有图标的JLabel,这不会是一个问题

查看渲染时ImageComponent的大小——我敢打赌它非常小,甚至是0大小

这是因为您从未为组件设置首选尺寸


真正的问题是你为什么要自己画这幅画。不需要创建自定义组件。只需使用带有图标的JLabel,这不会是一个问题。

什么是
getCodeBase()
返回的,什么是
setImage()
期望的?什么是
getCodeBase()
返回的,什么是
setImage()
期望的?啊,谢谢,这正是我应该知道的,甚至,因为我在窗口应用程序中使用了不同的布局管理器。沮丧+疲劳=脑死。@Erika:不用担心。有时候,你只需要有一双不同的眼睛来审视事情。大脑会重新启动的,我保证。\呃,谢谢你,正是这样……我应该知道,即使我在窗口应用程序中使用了不同的布局管理器。沮丧+疲劳=脑死。@Erika:不用担心。有时候,你只需要有一双不同的眼睛来审视事情。大脑将重新启动,保证。\n今天的Swing真正基本的东西+1今天的Swing真正基本的东西+1