2013-10-09 59 views
1

我正在嘗試將圖像繪製到面板上,該圖像由一個框架包含。獨立於平臺的圖像java中的圖像

讓我們說我有一個320×480的圖像。 當我嘗試創建一個大小爲320x480的框架並將面板添加到其中時,我遇到了問題。

在不同的操作系統中,由於標題欄的緣故,320x480的JFrame大小不同。 因此,我在Windows XP或Windows XP中正確匹配的圖像將無法正確繪製。

灰色補丁是可見的,因爲圖像沒有正確放置。 我試着重寫paint方法並使用ImageIcon。

請提供解決方案。

TIA

代碼段

CLASS PA CONTENTS 
setPreferredSize(new Dimension(500,500)); 
. 
. 
JLabel image= new JLabel(); 
ImageIcon background = new ImageIcon(getClass().getClassLoader().getResource("Flower.jpg")); 
image.setBounds(0, 0, 500, 500); 
image.setIcon(background); 
this.add(image); //where "this" is extending from JPanel 

CLASS PB CONTENTS 
frame = new JFrame("Test"); 
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
inserting(frame.getContentPane()); 

frame.pack(); 
frame.setLocationRelativeTo(null); 
frame.setVisible(true); 
frame.setResizable(false); 

private void inserting(Container pane) 
{ 
cardPanel=new JPanel(); 
      CardLayout cards=new CardLayout(); 
cardPanel.setLayout(cards); 

PA home= new PA(); 
cardPanel.add(home,"homeScreen"); 

    pane.add(cardPanel); 
} 
+0

爲了得到更好更快的幫助,請提供[SSCCE(http://sscce.org) –

+2

你有沒有打過電話['包() '](http://docs.oracle.com/javase/7/docs/api/java/awt/Window.html#pack%28%29)在您的JFrame上,而不是明確地設置它的大小? – VGR

+0

是的,我已經使用了pack,因爲我明確指定了包含面板的大小。 這是問題嗎? (已加密碼) – user2756339

回答

4

根本不要撥打setSize,請致電pack(如VGR在其評論中所述)。 pack將根據其中的組件大小以及這些組件之間的差距確定您的尺寸JFrame

現在..你會遇到的問題是,你的JFrame將在啓動時很小。所以覆蓋爲JPanelgetPreferredSize方法來回報您的圖像尺寸:

public void getPreferredSize() { 
    return new Dimension(image.getWidth(), image.getHeight()); 
} 

現在你的圖像將完全適合您的應用程序將是完全獨立於操作系統。 而且,請勿覆蓋paint方法。相反,覆蓋paintComponent。 這裏是一個小的演示我的情況下,作出像您一樣的:

import javax.imageio.ImageIO; 
import javax.swing.*; 
import java.awt.*; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 


public class Drawing { 
    JFrame frame = new JFrame(); 

    public Drawing() { 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     frame.add(new Panel()); 
     frame.pack(); 
     frame.setVisible(true); 

    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new Drawing(); 
      } 
     }); 
    } 

    class Panel extends JPanel { 
     BufferedImage image = null; 

     Panel() { 
      try { 
       image = ImageIO.read(new File("path-to-your-image")); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      g.drawImage(image, 0, 0, this); 
     } 

     @Override 
     public Dimension getPreferredSize() { 
      // Panel will be sizes based on dimensions of image 
      return new Dimension(image.getWidth(), image.getHeight()); 
     } 
    } 
} 
1

這似乎是佈局問題。最明顯的解決方案是將圖像面板封裝到具有適當佈局的另一個容器中,因此面板始終具有相同的大小。