2016-02-17 24 views
0

最近我一直在嘗試使用java圖形,並決定製作一個可以打印圖像拼貼的程序。該程序的構造函數需要一個圖像數組和每個圖像將顯示的寬度。爲什麼JFrame不顯示整個圖像?

import java.awt.*; 
import java.awt.image.BufferedImage; 
import java.awt.event.*; 
import java.awt.image.*; 
import java.io.*; 
import javax.imageio.*; 
import javax.swing.*; 
public class CollageTest extends JComponent 
{ 
    private Image [][] board; //Holds images within it. 
    private int pixel;//width of image. 


    public CollageTest(Image x[][], int pixel) 
    { 
     board = x; 
     this.pixel = pixel; 
    } 
    public int getPixel() 
    { 
     return pixel; 
    } 
    public void paint(Graphics g) 
    { 
     for (int i = 0; i < board.length; i++) 
     { 
      for (int j = 0; j < board[0].length; j++) 
      { 
       g.drawImage(board[i][j], (i * pixel) , (j * pixel), pixel, pixel, null); 
      } 
     } 
    } 




    public static void main(String args[]) 
    { 
     BufferedImage[][] images = new BufferedImage[20][20]; 
     BufferedImage img = null; 
     try { 
      img = ImageIO.read(new File("gorge3.jpg")); 
     } catch (IOException e) { 
     } 

     for (int i = 0; i < images.length; i++) 
     { 
      for (int j = 0; j < images[0].length; j++) 
      { 
       images[i][j] = img; 
      } 
     } 
     CollageTest test = new CollageTest(images, 20); 
     JFrame frame = new JFrame("MyCollage"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(test); 
     frame.setSize(test.getPixel() * images.length,test.getPixel() * images[0].length); 
     frame.setVisible(true); 
     test.repaint(); 

    } 
} 

爲了測試我使用20×20陣列完全與此圖像填充初始化的CollageTest。 I filled an array with this image

當我運行該程序最初我用下面的設置Jframe的窗口的大小:

frame.setSize(test.getPixel() * images.length,test.getPixel() * images[0].length); 

不幸的是,做的JFrame圖像的顯示部分。 JFrame窗口不足以顯示所有窗口。 要加倍仔細檢查我的數學是不脫,我測試使用以下行替換:

frame.setSize(400, 400);//Math 20 images * 20 pixels = 400 pixels 

同樣的問題發生。 直到我用下面一行,整個圖像顯示:

frame.setSize(400, 437); 

所以我的問題是,爲什麼我的JFrame的行爲不端,是他們的一個更好的辦法來解決這個問題?

+0

標題欄可以佔這些像素中的37個。它的窗口大小,而不是可繪製的畫布。 – jheimbouch

+0

哦,這是有道理的。感謝您的幫助。 – star2wars3

回答

1

問題就出在這裏:

frame.setSize(test.getPixel() * images.length,test.getPixel() * images[0].length); 

您根據圖像尺寸手動設置幀大小。但是,框架大小需要標題欄,並可能考慮邊界。如果標題欄佔用37個像素,則會爲圖像留下較小的37個像素。

我會做的是:

圖像添加到一個JPanel。您可以根據圖像設置面板的大小。在添加包含圖像的面板後,您的JFrame將自動確定JFrame的首選大小。