为什么这个小程序不工作/显示图像?

时间:2011-06-05 23:51:26

标签: java swing applet

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

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);
    }
}

2 个答案:

答案 0 :(得分:2)

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

解决方案是使用已经存在于applet中的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

答案 1 :(得分:2)

  

检查你的ImageComponent在渲染时的大小 - 我敢打赌,它非常小,甚至是0大小。

这是因为您从未为您的组件设置首选大小。

真正的问题是你为什么要自己绘制图像。无需创建自定义组件。只需使用带有Icon的JLabel,这不会有问题。