2012-03-06 2 views
2

코드를 실행해도 나타나지 않습니다. 기본적으로 나는 JFrame 또는 View에 추가 한 사용자 정의 Jcomponent를 가지고 있으며 Main 메서드에서 프레임을 만드는 View를 만듭니다. JComponent에 대한사용자 정의 JComponent의 이미지가 표시되지 않습니까?

public class CardDisplay extends JComponent { 
private Card card; 
private Image cardImage; 

public CardDisplay() 
{ 
    cardImage = Toolkit.getDefaultToolkit().createImage(("Phase10//res//Blue2.png")); 
} 

@Override 
public void paint(Graphics g) 
{ 
    g.drawImage(cardImage, 125 ,200, this); 
} 
public class View { 
public View(){ 

} 

public void makeFrame() 
{ 
    JFrame frame = new JFrame("Phase 10"); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setLayout(new BorderLayout()); 
    JPanel handPanel = new JPanel(); 
    CardDisplay cd = new CardDisplay(); 
    handPanel.setLayout(new FlowLayout()); 
    frame.add(handPanel, BorderLayout.SOUTH); 
    handPanel.add(cd); 
    frame.pack(); 
    frame.setSize(600,500); 
    frame.setResizable(false); 
    frame.setLocationRelativeTo(null); 
    frame.setVisible(true); 
} 

public static void main(String[] args){ 
    View view = new View(); 
    Game game = new Game(); 
    view.makeFrame(); 
    //game.run(); 

} 
+0

은 내 게시물 http://stackoverflow.com/a/8422427/1007845 – Adrian

+0

앱을 시작할 때이 아마 EventQueue의에서 문제를 참조하십시오. 응용 프로그램을 시작하고 CardDisplay를 만드는 코드 행을 추가하십시오. – Serhiy

+0

@Adrian - 시도했지만 여전히 작동하지 않습니다. – Rendition

답변

3

다음은 작동 버전입니다. 문제는 주로 구성 요소의 기본 크기와 관련이 있습니다. 메소드 getPreferredSize()의 구현에 유의하십시오.

구성 요소 경계가 무엇인지보고 싶다면 디버그 모드에서 MigLayout 레이아웃 관리자를 사용하는 것이 좋습니다 (이 사이트에는 필요한 모든 문서가 포함되어 있습니다).

public class CardDisplay extends JComponent { 
    private BufferedImage cardImage; 

    public CardDisplay() { 
     try { 
      cardImage = ImageIO.read(new File("Phase10//res//Blue2.png")); 
     } catch (final IOException e) { 
      e.printStackTrace(); 
     }  
    } 

    @Override 
    public void paintComponent(final Graphics g) { 
     super.paintComponent(g); 
     g.drawImage(cardImage, 0, 0, null); 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     if (cardImage == null) { 
      return new Dimension(100, 100); 
     } else { 
      return new Dimension(cardImage.getWidth(null), cardImage.getHeight(null)); 
     } 
    } 

    public static class View { 
     public View() {} 

     public void makeFrame() { 
      final JFrame frame = new JFrame("Phase 10"); 
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      frame.setLayout(new BorderLayout()); 
      final JPanel handPanel = new JPanel(); 
      final CardDisplay cd = new CardDisplay(); 
      handPanel.setLayout(new FlowLayout()); 
      frame.add(handPanel, BorderLayout.SOUTH); 
      handPanel.add(cd); 
      frame.pack(); 
      frame.setResizable(false); 
      frame.setLocationRelativeTo(null); 
      frame.setVisible(true); 
     } 
    } 

    public static void main(final String[] args) { 
     final View view = new View(); 
     view.makeFrame(); 
    } 
} 
+0

+1, getPreferredSize() 작업 우선 :-) –

+0

코드를 구현했으며 입력 파일을 읽을 수 없다는 오류를 보냅니 까? 나는 이것을 게시하기 전에 ImageIO.read를 사용해 보았고 똑같은 것을 얻었다. 파일 확장자가 문제가 아닌지 확인하기 위해 클래스와 동일한 폴더로 파일을 옮겨 보았습니다. – Rendition

+0

이 코드를 위해 만든 로컬 프로젝트에서는 실제 파일이 프로젝트의베이스에 위치하는 것은 단순히 "image.jpg"였습니다. – 01es

2

, 당신은 대신 페인트의 paintComponent를 사용 : 이미 JFrame의 추가 여기 JComponent에 내 코드입니다. 페인트는 실제로 paintComponent가 이미지를 그리는 데 사용되는 동안 구성 요소를 그리는 데 사용됩니다.

+0

paintComponent (Graphics g)로 변경 한 후에 페인트하지 않음 – Rendition

+0

@Shawn Shroyer +1 for paintComponent() – mKorbel

+0

+1 Swing 용 paintComponent (...)에 대해 +1하는 것만으로 JComponent 용 getPreferredSize()를 오버라이드합니다. paintComponent()를 사용하면 출력에서 ​​보려는 내용을 볼 수 있습니다. –

관련 문제