2015-02-03 2 views
0

그래서 '프레임'JPanel '패널'을 사용하여 '프레임'내 JFrame에 여러 클래스를 추가하려고하는데 효과가없는 것 같습니다.하나의 JFrame에 여러 클래스를 추가하는 방법은 무엇입니까?

import java.awt.Color; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class Frame 
{ 
    public static void main (String[] args) 
    { 
     JPanel panel = new JPanel(); 
     panel.setBackground (Color.WHITE); 
     panel.add (new Player()); // Class with paintComponent method. 
     panel.add (new Terrain()); // Class with paintComponent method. 

     JFrame frame = new JFrame ("Java Game"); 
     frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); 
     frame.setSize (1000, 600); 
     frame.getContentPane().add (panel); 
     frame.setVisible (true); 
    } 
} 

내가 프로그램을 실행하면 JFrame의 흰색 배경에 나타나지만 플레이어 및 지형 클래스에서의 paintComponent 메소드가 호출되지 않는, 그래서 아무것도 다른 렌더링되고 있지 : 여기 내 메인 클래스입니다. 이 코드에 문제가 있습니까? 감사.

편집 :

플레이어 : 여기 내 플레이어 및 지형 클래스입니다

import java.awt.Color; 
import java.awt.Graphics; 
import javax.swing.JComponent; 

@SuppressWarnings ("serial") 
public class Player extends JComponent 
{ 
    int x = 50; 
    int y = 450; 

    public void paintComponent (Graphics graphics) 
    { 
     graphics.setColor (Color.BLACK); 
     graphics.fillRect (x, y, 50, 50); 
    } 
} 

지형 : 당신은 PlayerTerraingetPreferredSize을 무시하는 데 실패했습니다

import java.awt.Graphics; 
import java.awt.Color; 
import javax.swing.JComponent; 

@SuppressWarnings ("serial") 
public class Terrain extends JComponent 
{ 
    Player playerClass = new Player(); 

    public void paintComponent (Graphics graphics) 
    { 
     graphics.setColor (Color.GREEN); 
     graphics.fillRect (0, 500, 1000, 500); 
    } 
} 
+1

문제를 설명하는 [실행 가능한 예제] (https://stackoverflow.com/help/mcve)를 제공하십시오. 이렇게하면 혼란이 줄어들고 응답이 향상됩니다. – MadProgrammer

+1

장기 실행 코드 또는 차단 코드로 이벤트 발송 스레드를 차단할 수 있습니다. 'Player' 또는'Terrian' 클래스의'getPreferredSize'를 오버라이드 (override)하지 않았을 수 있습니다. 디폴트의 사이즈는'0x0'입니다. 'super.paintComponent'를 호출 할 수 없습니다. 모든 종류의 이상한 그림 문제를 일으 킵니다. 추측을 계속 하시겠습니까? – MadProgrammer

답변

2
  1. , 기본 크기 인 0x0으로 레이아웃되도록합니다.
  2. 당신은 그림 문제와 유물의 끝을 일으킬 수 없었다 super.paintComponent를 호출하지 않음으로써 페인트 사슬을 끊었다
  3. Terrain에서 Player의 기준이 화면에 참조 할 수 없다

자세한 내용은 Laying Out Components Within a Container, Painting in AWT and SwingPerforming Custom Painting을 참조하십시오.

+0

지형에서 Player의 참조는 실제로 이전에 작업했던 것의 유물입니다. : P – AmiableNebula

+0

정보를 제공해 주셔서 감사합니다 (다시). super.paintComponent를 추가하고 Player 및 Terrain에서 내 창 크기와 일치하도록 getPrefferedSize를 재정의했습니다. 그러나 이제는 Frame.java에서 JPanel에 추가 한 첫 번째 클래스 (이 경우 Player)가 렌더링됩니다. – AmiableNebula

+0

예, 일반적으로 FlowLayout에서는 나란히 추가됩니다 (setSize 대신 프레임에서 pack을 호출 해보십시오). 대신 플레이어를 지형에 추가해보십시오. BTW, 나는 일반적으로 컴포넌트 기반의 엔티티를 피하고 그 대신 페인트 가능하고 단일 컴포넌트 내에 모든 것을 그려 넣을 수있는 개념을 고안합니다. – MadProgrammer

관련 문제