[java] JPanel에 이미지를 추가하는 방법?

나는이 JPanel의 나는 즉시 생성 할 것을 JPEG 및 PNG 이미지를 추가하고 싶은에 있습니다.

지금까지 Swing Tutorials 에서 본 모든 예제 , 특히 Swing 예제 에서는 ImageIcons를 사용 합니다.

이 이미지를 바이트 배열로 생성하고 있으며 일반적으로 640×480에서 예제에서 사용하는 공통 아이콘보다 큽니다.

  1. ImageIcon 클래스를 사용하여 JPanel에 해당 크기의 이미지를 표시 할 때 (성능 또는 기타) 문제가 있습니까?
  2. 일반적인 방법은 무엇입니까 ?
  3. ImageIcon 클래스를 사용하지 않고 JPanel에 이미지를 추가하는 방법은 무엇입니까?

편집 : 자습서 및 API를 자세히 살펴보면 ImagePacon을 JPanel에 직접 추가 할 수 없음을 알 수 있습니다. 대신 이미지를 JLabel의 아이콘으로 설정하여 동일한 효과를 얻습니다. 이건 그냥 기분이 좋지 않아 …



답변

내가하는 방법은 다음과 같습니다 (이미지를로드하는 방법에 대한 정보가 조금 더 있습니다).

import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.JPanel;

public class ImagePanel extends JPanel{

    private BufferedImage image;

    public ImagePanel() {
       try {                
          image = ImageIO.read(new File("image name and path"));
       } catch (IOException ex) {
            // handle exception...
       }
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawImage(image, 0, 0, this); // see javadoc for more info on the parameters            
    }

}


답변

JPanel을 사용하는 경우 아마도 Swing으로 작업하고있을 것입니다. 이 시도:

BufferedImage myPicture = ImageIO.read(new File("path-to-file"));
JLabel picLabel = new JLabel(new ImageIcon(myPicture));
add(picLabel);

이미지는 이제 스윙 구성 요소입니다. 다른 구성 요소와 마찬가지로 레이아웃 조건이 적용됩니다.


답변

프레드 하 슬람의 방식은 잘 작동합니다. 항아리 내에서 이미지를 참조하고 싶기 때문에 파일 경로에 문제가있었습니다. 이를 위해 다음을 사용했습니다.

BufferedImage wPic = ImageIO.read(this.getClass().getResource("snow.png"));
JLabel wIcon = new JLabel(new ImageIcon(wPic));

이 방법을 사용하여로드 해야하는 유한 번호 (약 10 개)의 이미지 만 가지고 있기 때문에 잘 작동합니다. 올바른 상대 파일 경로가 없어도 파일을 가져옵니다.


답변

나는 아무것도 서브 클래스 할 필요가 없다고 생각합니다. Jlabel을 사용하십시오. 이미지를 Jlabel로 설정할 수 있습니다. 따라서 Jlabel의 크기를 조정 한 다음 이미지로 채우십시오. 괜찮아. 이것이 내가하는 방식입니다.


답변

무료 SwingX 라이브러리 에서 JXImagePanel 클래스를 사용하여 자체 컴포넌트 서브 클래스를 완전히 롤링하지 않아도 됩니다.

다운로드


답변

JLabel imgLabel = new JLabel(new ImageIcon("path_to_image.png"));


답변

JPanel을 서브 클래 싱 할 수 있습니다. 다음은 ImagePanel에서 추출한 것입니다. 이미지는 위 / 왼쪽, 위 / 오른쪽, 중간 / 중간, 아래쪽 / 왼쪽 또는 아래쪽 / 오른쪽의 5 개 위치 중 하나에 이미지를 배치합니다.

protected void paintComponent(Graphics gc) {
    super.paintComponent(gc);

    Dimension                           cs=getSize();                           // component size

    gc=gc.create();
    gc.clipRect(insets.left,insets.top,(cs.width-insets.left-insets.right),(cs.height-insets.top-insets.bottom));
    if(mmImage!=null) { gc.drawImage(mmImage,(((cs.width-mmSize.width)/2)       +mmHrzShift),(((cs.height-mmSize.height)/2)        +mmVrtShift),null); }
    if(tlImage!=null) { gc.drawImage(tlImage,(insets.left                       +tlHrzShift),(insets.top                           +tlVrtShift),null); }
    if(trImage!=null) { gc.drawImage(trImage,(cs.width-insets.right-trSize.width+trHrzShift),(insets.top                           +trVrtShift),null); }
    if(blImage!=null) { gc.drawImage(blImage,(insets.left                       +blHrzShift),(cs.height-insets.bottom-blSize.height+blVrtShift),null); }
    if(brImage!=null) { gc.drawImage(brImage,(cs.width-insets.right-brSize.width+brHrzShift),(cs.height-insets.bottom-brSize.height+brVrtShift),null); }
    }