2014-10-05 5 views
0

JFileChooser에서 파일을 가져 와서 BufferedImage을 읽고 JLabels을 삽입하여 표시하고 있지만 이미지가 JLabels에 완전히 표시되지 않는 문제가 있습니다. 이 코드를 실행하면 다음은 사용자가 선택한 이미지를 보여줍니다하지만 그들은 종류의 자동 croped 및 JLabels에 완전히 표시되지 않는, 내 코드BufferedImage가 JLabel에서 전체 이미지를 표시하지 않는 이유는 무엇입니까?

public class ImagePreview 
{ 
    JPanel PicHolder= new JPanel(); 
    public ImagePreview() 
    { 
     JButton GetImages = new JButton("Browse Images"); 
     GetImages.addMouseListener(new MouseAdapter() 
     { 
      public void mouseClicked(MouseEvent evt) 
      { 
       CreatePreviews(); 
      }; 
     }); 
     PicHolder.add(GetImages); 

     JFrame MainFrame = new JFrame("Image Preview"); 
     MainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     MainFrame.getContentPane().add(PicHolder); 
     MainFrame.pack(); 
     MainFrame.setVisible(true); 
    } 
    public void CreatePreviews() 
    { 
     JFileChooser chooser = new JFileChooser(); 
     chooser.setMultiSelectionEnabled(true); 
     File[] selectedCarImages = chooser.getSelectedFiles(); 
     for(int a=0; a<selectedImages.length; a++) 
     { 
      try 
      { 
       BufferedImage myPicture = ImageIO.read(new File(selectedImages[a].getAbsolutePath())); 
       JLabel picLabel = new JLabel(new ImageIcon(myPicture)); 
       PicHolder.add(picLabel); 
      } 
     } 
    } 

    public static void main(String[] args) 
    { 
      java.awt.EventQueue.invokeLater(() -> { 
       new ImagePreview(); 
      }); 
    } 
} 

입니다.

여기에 무슨 문제가 있습니까? JLabel이 전체 ​​이미지를 표시하지 않는 이유는 무엇입니까?

+1

'하는 JButton GetImages = 새로운하는 JButton ("이미지 검색을") : 시험으로

image

속성 이름)을 사용하고 일관되게 사용하십시오. –

+0

아마 그 믹스 어딘가에'JScrollPane'이있을 것입니다. –

답변

3

기본값이 FlowLayout 인 단일 패널에 모든 구성 요소와 이미지가 추가됩니다. 대신 그림 레이블에 GridLayout을 사용하고 아래 그림과 같이 찾아보기 단추를 프레임의 기본값 인 BorderLayout에 추가하십시오. 특히 클래스에 사용되는 경우에 관해서 일반적인 자바 명명 규칙 (학습하세요`방법,

import java.awt.BorderLayout; 
import java.awt.GridLayout; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 
import javax.imageio.ImageIO; 
import javax.swing.ImageIcon; 
import javax.swing.JButton; 
import javax.swing.JFileChooser; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 

public class ImagePreview { 

    JFrame mainFrame = new JFrame("Image Preview"); 
    JPanel picHolder = new JPanel(new GridLayout(0, 1)); 

    public ImagePreview() { 
     JButton getImages = new JButton("Browse Images"); 
     getImages.addMouseListener(new MouseAdapter() { 
      @Override 
      public void mouseClicked(MouseEvent evt) { 
       CreatePreviews(); 
      } 
     }); 
     mainFrame.add(getImages, BorderLayout.NORTH); 
     mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     mainFrame.add(new JScrollPane(picHolder)); 
     mainFrame.pack(); 
     mainFrame.setLocationByPlatform(true); 
     mainFrame.setVisible(true); 
    } 

    public void CreatePreviews() { 
     JFileChooser chooser = new JFileChooser(); 
     chooser.setMultiSelectionEnabled(true); 
     chooser.showOpenDialog(mainFrame); 
     File[] selectedImages = chooser.getSelectedFiles(); 
     for (int a = 0; a < selectedImages.length; a++) { 
      try { 
       BufferedImage myPicture = ImageIO.read(new File(selectedImages[a].getAbsolutePath())); 
       JLabel picLabel = new JLabel(new ImageIcon(myPicture)); 
       picHolder.add(picLabel); 
       mainFrame.pack(); 
      } catch (IOException ex) { 
       ex.printStackTrace(); 
      } 
     } 
    } 

    public static void main(String[] args) { 
     java.awt.EventQueue.invokeLater(() -> { 
      new ImagePreview(); 
     }); 
    } 
} 
+0

Ok 휴지통 보겠습니다. –

+0

그러나 GridLayout은 흐름 레이아웃이 이미지의 기본 크기를 사용하려고했을 때와 동일한 크기를 갖는 모든 레이블을 만듭니다 ... 모두 WrapLayout을 사용하여 이미지를 직선으로 배치하고 싶습니다. 스크롤 창은 더 좋을 수도 있습니다 ... IMHOTEP – MadProgrammer

+1

@MadProgrammer : 나쁘면, 'GridLayout'은 _largest_; 스케일링은 다른 문제입니다. 나는'WrapLayout'에 동의한다; '나는이 컨텍스트에서 커스텀 렌더와 함께'JList'를 사용했습니다. – trashgod

관련 문제