2016-11-16 71 views
1

我無法獲取要在JFrame上顯示的圖像。 運行時車架全黑。這裏是我的代碼:未在JFrame上顯示Java - BufferedImage

import javax.swing.*; 
import java.awt.*; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 
import java.net.URISyntaxException; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import javax.imageio.ImageIO; 

public class JFrameTesting extends JFrame { 

    BufferedImage test = null; 

    public static void main(String[] args) throws URISyntaxException { 
     new JFrameTesting(); 
    } 
    public JFrameTesting() throws URISyntaxException { 
     JFrame frame = new JFrame("My first JFrame!"); 
     frame.setSize(400, 400); 
     frame.setVisible(true); 
     frame.setLocationRelativeTo(null); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     try { 
      test = ImageIO.read(new File(getClass().getResource("test.png").toURI())); 
     } catch (IOException ex) { 
      Logger.getLogger(JFrameTesting.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 


    public void paint(Graphics g) { 
     super.paint(g); 
     g.drawImage(test, 200, 200, null); 
    } 
} 

我不知道我是否nessecarily做任何錯誤。運行時我完全沒有錯誤。

提前致謝!

+0

你如何運行代碼? –

+0

您可以在JLabel上調用setIcon(),並將該標籤放置到框架上 – Chains

+0

嘗試通過覆蓋'paintComponent'方法而不是直接在框架上繪製'JFrame'內的'JPanel'。 –

回答

0

你可以試試這個代碼。 當您添加圖像時,您需要在Jframe上加載JLabel。

BufferedImage test = null; 

public static void main(String[] args) throws URISyntaxException { 
    new JFrameTesting(); 
} 
public JFrameTesting() throws URISyntaxException { 
    JFrame frame = new JFrame("My first JFrame!"); 
    JLabel label = new JLabel(); 
    frame.setSize(800, 800); 
    frame.setLocationRelativeTo(null); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    try { 
     test = ImageIO.read(new File(getClass().getResource("test.png").toURI())); 
     frame.add(new JLabel(new ImageIcon(test)),BorderLayout.CENTER); 
     frame.setIconImage(test); 
     frame.setVisible(true); 
     label.setVisible(true); 
    } catch (IOException ex) { 
     Logger.getLogger(JFrameTesting.class.getName()).log(Level.SEVERE, null, ex); 
    } 
} 


public void paint(Graphics g) { 
    super.paint(g); 
    g.drawImage(test, 200, 200, null); 
} 

}

+0

您需要在添加圖像時在Jframe上加載JLabel。 – dunknisai

+0

工作完美!非常感謝。 – JKode

0

您尚未將圖像添加到JFrame中。要顯示圖像,您需要將BufferedImage添加到組件上,然後繪製該圖像。您可以使用JLabel和ImageIcon來完成此操作。

public class JFrameTesting extends JFrame { 

    BufferedImage test = null; 
    ImageIcon image = new ImageIcon(); 

    public static void main(String[] args) throws URISyntaxException { 
     new JFrameTesting(); 
    } 
    public JFrameTesting() throws URISyntaxException { 
     JFrame frame = new JFrame("My first JFrame!"); 
     try { 
      test = ImageIO.read(new File(getClass().getResource("test.png").toURI())); 
      image.setImage(test); 
     } catch (IOException ex) { 
      Logger.getLogger(JFrameTesting.class.getName()).log(Level.SEVERE, null, ex); 
     } 
     JLabel label = new JLabel(); 
     label.setIcon(image); 
     frame.add(label); 
     frame.setSize(400, 400); 
     frame.setVisible(true); 
     frame.setLocationRelativeTo(null); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 

}

或者你可以跳過標籤,如果你想畫到組件上。在這種情況下,您必須重寫JPanel的繪製方法。

JPanel pane = new JPanel() { 
     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      g.drawImage(image, 200, 200, null); 
     } 
    }; 
frame.add(pane); 

另一個需要注意的是你要擴展JFrame,但是也要在類中創建一個新的JFrame。您可以刪除額外的JFrame和所有「框架」。這個類本身就是一個JFrame,所以你不需要額外的一個。

//set the title using the setTitle method 
setTitle("My first JFrame!"); 

add(label); 
setSize(400, 400); 
setVisible(true); 
setLocationRelativeTo(null); 
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE) 

此外,我相信ImageIO.read(...)方法可以將URI作爲參數,因此您不必從中創建文件。

+0

「你還沒有實際上已將您的圖片添加到JFrame中。「:哦,是啊?和整個drawImage它在那裏做什麼?這是絨毛你在這裏添加 – gpasch

+0

圖像需要被添加到一個組件,將繼續在JFrame上,而不是直接在JFrame上。在我的回答中,我指定覆蓋JPanel的paintComponent方法將作爲替代方法。 – Brion

0

我的代碼繪製圖像,但需要重繪。爲此,您需要例如使用鼠標更改幀的大小。

import javax.swing.*; 
import java.awt.*; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 
import java.net.URISyntaxException; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import javax.imageio.ImageIO; 

public class JFrameTesting extends JFrame { 

    BufferedImage test = null; 

    public static void main(String[] args) throws URISyntaxException { 
     new JFrameTesting(); 
    } 
    public JFrameTesting() throws URISyntaxException { 
     JFrame frame = new JFrame("My first JFrame!"); 
     frame.setSize(400, 400); 
     frame.setVisible(true); 
     frame.setLocationRelativeTo(null); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     try { 
      System.out.println("init"); 
      test = ImageIO.read(new File(getClass().getResource("test.png").toURI())); 
      System.out.println(test); 
     } catch (IOException ex) { 
      Logger.getLogger(JFrameTesting.class.getName()).log(Level.SEVERE, null, ex); 
     } 

     final JPanel pane = new JPanel() { 
      @Override 
      protected void paintComponent(Graphics g) { 
       System.out.println("paint"); 
       super.paintComponent(g); 
       g.drawImage(test, 0, 0, null); 
      } 
     }; 
     frame.add(pane); 
     frame.repaint(); 
    } 

    @Override 
    public void paint(Graphics g) { 
     super.paint(g); 
     System.out.println("paint"); 
     g.drawImage(test, 200, 200, null); 
    } 
}