2012-12-14 155 views
2

以下是我目前使用的代碼: 所有導入都是正確的。我確定。 :DJFrame未顯示圖片

當我運行程序時,我所得到的只是一個空白幀,沒有圖片。它應該顯示出來。

public class WindowPractice extends JFrame { 

    final static int width= 800; 
    final static int height= 400; 
    int x; 
    int y; 
    Image steve; 
    Dimension gamesize= new Dimension (width, height); 
    public WindowPractice(){ 
     setTitle ("Hangman"); 
     setSize (gamesize); 
     setVisible (true); 
     setResizable (false); 
     setLocationRelativeTo (null); 
     setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); 


    } 
    public static void main (String[] args) { 
     new WindowPractice(); 
     ImageIcon steve= new ImageIcon ("Libraries/Pictures/ba190cd951302bcebdf216239e156a4.jpg"); 
     JLabel imageLabel = new JLabel(steve); 

    } 
    public void paint(Graphics g){ 

     g.setColor(Color.red); 
     //g.fillRect( x, y, 100, 20); 
     g.drawImage(steve, x, y,this); 


     x= 150; 
     y= 250; 
    } 

} 
+2

兩件事。 1)'史蒂夫'是空的,所以沒有畫。 2)'paintComponent'應該被自定義繪畫覆蓋,而不是'paint'。 – Vulcan

+0

@Vulcan雖然我同意你的('paintComponent')是自定義繪畫的更好選擇,'JFrame'沒有'paintComponent'方法;) – MadProgrammer

+0

@MadProgrammer我完全沒有注意到它是一個JFrame,哎呀!我馬上認爲這是一個JPanel。 – Vulcan

回答

6

有這麼多事情不對的,我不知道從哪裏開始...

讓我們從頭開始......

問題#1

你在WindowPractice類中聲明瞭一個名爲steve的實例字段,這很好,但是在你的主要方法中,你聲明瞭另一個名爲steve的變量,你正在使用對加載的ima的引用ge ...

public static void main(String[] args) { 
    new WindowPractice(); 
    ImageIcon steve = new ImageIcon("C:/Users/shane/Dropbox/issue459.jpg"); 
    JLabel imageLabel = new JLabel(steve); 
} 

這意味着類實例變量永遠不會被初始化並且仍然是null

問題#2

雖然沒有直接的關係,你永遠不會從你的paint方法調用super.paint。這是一個大否,沒有。你有義務維護油漆鏈。油漆方法很複雜,非常非常重要。

問題#3

你不應該忽略一個頂層容器(如JFrame),也不是你,你應該重寫任何它paint方法。這有很多原因,但是前兩種方法中,大多數頂級容器實際上都包含許多組件(JRootPane,其中包含玻璃窗格,內容窗格,圖層窗格和菜單欄),這些組件可以放在您的繪畫工作上並且通常它們不是雙緩衝的,這意味着您的繪製更新將閃爍並且看起來很可怕;)

您也應該避免使用paint,而應該使用paintComponent來尋找它可用的位置。

問題#4

ImageIcon是加載圖像不是你最好的選擇。我不使用它們的主要原因是,你不知道被加載的圖像實際上何時可用(實際上有許多方法,但坦率地說,ImageIO只是更簡單)。這是1999年的一個很棒的功能,當時的撥號速度在14.4k左右,但現在天...

ImageIO支持更寬範圍的圖片格式,支持讀取和寫入圖片,並保證當方法返回(成功),圖像像素數據可用於您的應用程序。

這裏有一個更好的(恕我直言)方法...

enter image description here

public class BetterDrawing { 

    public static void main(String[] args) { 
     new BetterDrawing(); 
    } 

    public BetterDrawing() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
       } 

       JFrame frame = new JFrame(); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setLayout(new BorderLayout()); 
       frame.add(new PaintPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class PaintPane extends JPanel { 

     private BufferedImage background; 

     public PaintPane() { 
      try { 
       background = ImageIO.read(new File("/path/to/image")); 
       // Use this instead to load embedded resources instead 
       //background = ImageIO.read(getClass().getResource("/path/to/image")); 
      } catch (IOException ex) { 
       ex.printStackTrace(); 
      } 
     } 

     @Override 
     public Dimension getPreferredSize() { 
      return background == null ? super.getPreferredSize() : new Dimension(background.getWidth(), background.getHeight()); 
     } 

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 

      if (background != null) { 

       int x = (getWidth() - background.getWidth())/2; 
       int y = (getHeight() - background.getHeight())/2; 

       g.drawImage(background, x, y, this); 

      } 

     } 
    } 
} 

讀一些更多的信息。

+0

非常感謝!這有助於幫助。 – Mizu

+0

偉大的,描述性的答案。 +1 – Vulcan

+0

+1,但請注意,該圖片很可能會在應用程序發佈時變成[tag:embedded-resource]。已部署,應該由'URL'訪問。 –