簡體   English   中英

無法使用JComponent繪制簡單圖像

[英]Unable to draw a simple image using JComponent

我正在使用netbeans IDE來練習一些Java基本代碼。 但我繪制PNG圖像失敗了。 以下是我的代碼,

package JavaApplication1;

import javax.swing.*;
import java.awt.*;

class MyCanvas extends JComponent
{
    Image img;
    public MyCanvas(){
        img = Toolkit.getDefaultToolkit().createImage("pengbrew.png");
    }

    public void paintComponent(Graphics g){
        super.paintComponent(g);
        g.drawImage(img, 0, 0, null);
    }
}

public class JavaGame
{
    public static void main(String args[]){
        JFrame window = new JFrame("Image demo");
        window.getContentPane().add( new MyCanvas() );
        window.setSize(400,400);
        window.setVisible(true);
    }
}

我在netbeans項目中添加了圖像。

請指教。

非常感謝。

最簡單的方法是找一個JLabel那是最好的JComponents圖標/ ImageIcon的例子在這里

要加載圖像,請使用ImageIO.read(File file) 它是一個更新的API,更易於使用和更好的支持。 有關加載圖像的教程,請訪問http://docs.oracle.com/javase/tutorial/2d/images/loadimage.html,如果您需要更多指針的話。

你的代碼看起來像這樣,

Image img;
public MyCanvas(){
    try {
        img = ImageIO.read(new File("pengbrew.png"));
    } catch (IOException e) {
        // Handle exception if there is one.
    }
}

對於為什么你使用的方法不起作用的長期答案可能是因為以下...

您的圖像可能位於正確的位置,而Toolkit.createImage()在框架到達繪制之前尚未完成加載圖像。 Toolkit.createImage()在底層映像實際完成加載之前將控制權返回給您的應用程序。 您通常可以通過調整應用程序的大小來強制重繪來驗證這是否是問題。 如果在嘗試調整應用程序大小幾秒鍾后圖像顯示,則是由於在第一次繪制調用期間未加載圖像。

要確保在繼續之前加載圖像,您需要使用MediaTracker。 下面是一些示例代碼,用於確保在使用Image之前完成Image的加載。

Component component = new Component() {};
MediaTracker TRACKER = new MediaTracker(component);

...

Image image = Toolkit.getDefaultToolkit().createImage("imageToLoad.png");
synchronized(TRACKER) {
   int id = ++mediaTrackerID;
   TRACKER.addImage(image, id);
   try {
       TRACKER.waitForID(id, 0);
   } catch (InterruptedException ex) {
       image = null;
   }
   TRACKER.removeImage(image, id);
}
// Now you can use your image.

您將在方法loadImage(Image image)中的ImageIcon類中看到與此類似的代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM