2014-03-29 50 views
3

所以我有我自己的自定義JFrame,在其中我試圖創建一個自動調整大小的圖像包含在我的JFrame的內容JPanel,frameContent。我的JPanel的佈局管理器是MigLayout,所以我想我會再次創建一個JPanel的子項,名爲ImagePanel。這裏是我的ImagePanel class結束什麼看起來像:Java Swing在MigLayout中添加圖像代碼似乎沒有工作?

class ImagePanel extends JPanel{ 
    private static final long serialVersionUID = -5602032021645365870L; 
    private BufferedImage image; 

    public ImagePanel() { 
     try {     
      image = ImageIO.read(new File(getClass().getResource("../res/Title.png").toURI())); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     g.drawImage(image, getWidth(), getHeight(), null);  
    } 

} 

現在,由於某種原因,它似乎並不像它實際上是「工作」。當我建立我的主要JFrame的內容,我呼籲:

framecontent.add(new ImagePanel(), "pos 5% 5% 95% 45%"); 

這不是它沒有添加成分,與此代碼我能夠得到如下畫面:

enter image description here

請注意它是如何在灰色背景上勾勒出區域的,這意味着paintComponent(g)方法正在運行,程序也不會輸出任何錯誤,這很奇怪,所以這意味着它找到了我的圖像,而不是放置它。

這裏是我的文件層次結構是什麼樣子:

Project Folder > 
    src > 
     res > 
      Title.png (Picture I want to retrieve) 
     guiwork > 
      Working.class (Class that is running instructions/ main) 

得到了所有固定起來,這裏是自動調整的結果:

Result

回答

3

注意如何勾勒出這意味着paintComponent(g)方法正在運行,程序也不會輸出任何錯誤,這很奇怪,所以這意味着它找到了我的圖像,而不是放置它。

並非如此,因爲空圖像不會產生錯誤。爲了證明這一點,在paintComponent方法中測試你的圖像變量,你很可能會發現它實際上是空的。

即試試這個:

@Override 
protected void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    System.out.println("image is null: " + (image == null)); // TODO: Delete this 
    g.drawImage(image, getWidth(), getHeight(), null);  
} 

解決方案:不要你的資源變成一個文件,而是使用資源原樣,並確保你在正確的位置尋找它。


編輯
保單,你繪製圖像超出你的組件的邊界:

g.drawImage(image, getWidth(), getHeight(), null); 

嘗試:

g.drawImage(image, 0, 0, null); 

編輯2
如果你嘗試一個簡單的測試程序,像什麼:

import java.awt.image.BufferedImage; 
import java.io.IOException; 

import javax.imageio.ImageIO; 
import javax.swing.ImageIcon; 
import javax.swing.JOptionPane; 

public class TestImage { 
    public TestImage() throws IOException { 
     String path = "/res/Title.png"; 
     BufferedImage img = ImageIO.read(getClass().getResource(path)); 
     ImageIcon icon = new ImageIcon(img); 
     JOptionPane.showMessageDialog(null, icon); 
    } 
    public static void main(String[] args) { 
     try { 
     new TestImage(); 
     } catch (IOException e) { 
     e.printStackTrace(); 
     } 
    } 
} 

,並務必將本在同一位置作爲當前類。它運行嗎?

+0

我已經用'if(image == null)System.out.println(「Image is null」);'來測試它,並且它沒有輸出''圖像爲null'... – tanishalfelven

+1

@tanishalfelven:嗯,它輸出了什麼? –

+1

@tanishalfelven:請參閱我的編輯,開始的那個,「哦,不要」。 –

0

對於那些誰可能很難理解氣墊船的答案:

假設你有要在其中添加一個縮放圖像的面板,下面的代碼會替你

import net.miginfocom.swing.MigLayout; 
import javax.swing.*; 
import java.awt.*; 

public class MasterSlidePanel extends JPanel { 
    private ImageIcon imageIcon; 
    private JLabel image; 

    public MasterSlidePanel() { 
     super(new MigLayout("", "2% [] 2%", "2% [] 2%")); 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     image.setIcon(new ImageIcon(imageIcon.getImage().getScaledInstance(image.getWidth(), image.getHeight(), Image.SCALE_SMOOTH))); 
     super.paintComponent(g); 
    } 

    public void setImage(SlidePanel panel) { 
     imageIcon = <Where you get the imageIcon>; 
     image = new JLabel(); 
     image.setMinimumSize(new Dimension(10, 10)); 
     image.setPreferredSize(new Dimension(10, 10)); 
     this.add(image, "width 96%, height 96%"); 
    } 
} 

我們增加2個新成員面板,圖像和imageIcon。當應用程序需要繪製面板時,imageIcon的縮放比例將被加載並提供給圖像。

要防止0高度/寬度錯誤,我們添加一個最小尺寸到JLabel。

希望這會有所幫助。

學分仍然去HoverCraft充滿鰻魚。