2011-06-05 65 views
1

我是Applets的新手,我試圖讓一些基本知識變得舒適 - 比如如何在一箇中顯示一個jpg圖像。我已經閱讀了我認爲Applets上的Java教程的相關部分,我不明白爲什麼這不起作用,我得到的只是一個空白的小程序區域。 「/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

getCodeBase()返回什麼?'setImage()'期望什麼? – 2011-06-05 23:55:40

回答

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 
+0

呃,謝謝,那就是它......我應該知道,即使是因爲我已經在窗口應用程序中使用了不同的佈局管理器。挫折+疲勞= braindead。 – 2011-06-06 00:11:25

+1

@Erika:不用擔心。有時你只需要有一組不同的眼睛來看看事情。大腦將重新啓動,承諾。\ – 2011-06-06 00:12:34

2

檢查,看看你的ImageComponent多大渲染時 - 我敢打賭,你這是非常小的,0大小均勻。

這是因爲您從未爲您的組件設置首選大小。

真正的問題是你爲什麼要自己畫圖像。無需創建自定義組件。只需使用帶有圖標的JLabel,這不會成爲問題。

+0

今天的真正基本東西Swing +1 – mKorbel 2011-06-06 03:05:21