2012-05-29 100 views
2

我在顯示圖片時出現問題。當圖片顯示時,左上角不會轉到指定的(0,0),當我第一次運行它時,窗口的背景也會顯示窗口後面的任何可視組件。有人知道什麼是錯的嗎?由於在高級 -在java中顯示圖片

import java.awt.image.ImageObserver; 
import java.io.File; 
import javax.imageio.*; 
import javax.swing.*; 

public class Window extends JFrame{ 
//the pictures 
Image testImage = null; 
Image backPic = null; 


//constructor 
Window(){ 
    super("window"); 
    this.startWindow(); 
} 

public void startWindow(){ 
    Image customIcon = Toolkit.getDefaultToolkit().getImage("iconImage.gif"); 
    testImage = Toolkit.getDefaultToolkit().getImage("tester.gif"); 
    backPic = Toolkit.getDefaultToolkit().getImage("black.png"); 
    setSize(700,600); 
    setIconImage(customIcon); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setVisible(true); 
    setResizable(false); 
    setLocationRelativeTo(null); 
} 


public void paint(Graphics g){ 
    g.drawImage(testImage,0,0,null); 
} 
} 
+0

你是否從EDT('SwingUtilities.invokeLater ...')調用'new Window()'? – assylias

+0

另外,你可能需要調用'super.paint(g)'來繪製框架的其餘部分。 – Yura

回答

2

所以我建議你使用JLabels的例子來說明Images,這是可以肯定的是使用simpliest方式。我創建了類似的基本項目,以這種方式展示。

/** 
* @author Sajmon 
*/ 

package com.sajmon.window; 

import java.awt.Container; 
import java.awt.FlowLayout; 
import javax.swing.ImageIcon; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 

public class Window extends JFrame { 

    private JLabel pictureLabel; 
    private Container controls; 

    public Window() { 
     super("window"); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setResizable(false); 
     setLocationRelativeTo(null); 
     this.setSize(300, 300); 
     this.startWindow(); 
    } 

    private void startWindow() { 
     controls = new Container(); 
     controls = getContentPane(); 
     controls.setLayout(new FlowLayout()); 
     pictureLabel = new JLabel(new ImageIcon("picture.png")); 
     controls.add(pictureLabel); 
    } 
} 

運行應用程序的主要方法。

/** 
* 
* @author Sajmon 
*/ 
public class Main { 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       Window w = new Window(); 
       w.setVisible(true); 
      } 
     }); 
    }  
} 

注:如果你使用Swing工作,你應該開始Runnable接口的應用程序。通常建議使用這種方式。

希望它有幫助。

+0

小東西,但你應該創建一個沒有間隙的左對齊流佈局,以便圖像出現在0,0:'新FlowLayout(FlowLayout.LEFT,0,0)' –

+0

所以它的唯一基本示例,開發人員可以選擇他需要的佈局。 – Sajmon

+0

謝謝!我會盡力使用這:) –

3

問題是,當調用paint()時,testImage尚未完全加載。爲了解決這個問題,可以改爲調用此:

g.drawImage(testImage,0,0,this); 

但我的首選方法是使用一個JLabel,讓它處理的圖像畫面。我也強烈建議不要覆蓋JFrame.paint()(如果你這樣做,至少請致電super.paint(g))。如果你真的想自己畫一幅圖片,請擴展JComponent並覆蓋paintComponent()