我是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);
}
}
答案 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,这不会有问题。