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

标签 java swing applet

我是小程序的新手,正在尝试熟悉一些基础知识 - 例如如何在一个小程序中显示 jpg 图像。我已经阅读了我认为是关于 Applets 的 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 添加到容器的组件不会像使用 FlowLayout 那样扩展以填充容器边框布局。检查渲染时您的 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

关于java - 为什么这个小程序不工作/显示图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6246722/

相关文章:

java - 小程序 - 将文本对齐到底部中间

java - 我怎样才能在这个任务中只运行一次任务

传输字节数组时出现 Java OutOfMemory 问题

Java Swing 动画看起来不稳定。如何让它看起来专业?

Java FileSystemView 隐藏文件夹

java - 使用 Selenium 自动化 Java Web applet 测试?

java - 为什么点击按钮时会出现相同的按钮?

java - "Could not find or load main class"使用命令行

java - JTextArea 无法正确读取文本

java - 使用html时JLabel消失