2014-11-21 3 views
1

이것은 멍청한 질문입니다. 우리는 수업에서 애플릿을 배우고 있으며, 나는 혼자서 뭔가를 시도하고있었습니다.패널에 그릴 paintComponent 오버라이드

다음은 지금까지 내가,의 paintComponent()를 명시 적으로 호출 할 필요는 이해 코드

import java.awt.*; 
import javax.swing.*; 


class controls extends JPanel{ 

@Override public void paintComponent(Graphics g) { 
    g.drawOval(50, 50, 50, 50); // <-- draws an oval on the panel 
} 

} 

public class test extends JApplet{ 
public void init(){ 
    final JPanel stage = new JPanel(); 
    final JPanel controlPanel = new controls(); 
    final JPanel banner = new JPanel(); 
    final JLabel name = new JLabel("Test", JLabel.CENTER); 
    this.setLayout(new BorderLayout()); 
    banner.setBackground(Color.CYAN); 
    banner.add(name); 
    this.add(controlPanel, BorderLayout.WEST); 
    this.add(banner, BorderLayout.NORTH); 
} 
} 

입니다. 컨트롤 클래스는 단독으로 사용하면 잘 작동합니다.

다음과 같은 코드가 작동한다는 의미입니다.

public class test extends JApplet{ 
public void init(){ 
    JPanel controlPanel = new controls(); 
    this.add(controlPanel); 
} 
} 

차이점을 이해할 수 없습니다. 이 경우 동일한 코드가 작동하는 이유는 무엇입니까?

감사합니다.

+0

잘 모르겠습니다. 어떤 코드가 작동하고 어떤 코드는 작동하지 않습니까? 작동하지 않는 코드를 실행하면 어떻게됩니까? –

+0

@MichaelMyers : 레이아웃이없는 코드가 작동합니다. 레이아웃이있는 패널은 배너 패널을 표시하지만 테스트 클래스에서 만든 객체가있는 컨트롤 패널은 표시하지 않습니다. – psyc0der

답변

4

controls 클래스에서 public Dimension getPreferredSize() (및 new Dimension)을 다시 정의하십시오. WEST에 구성 요소를 배치 할 때 너비는 preferredSize에 의해 결정됩니다. getPreferredSize을 덮어 쓰지 않으면 기본 크기는 0입니다. CENTERWEST이 계산 된 후 나머지 공간을 차지합니다. 두 번째 경우는 기본값 인 에 있기 때문에 작동합니다. BorderLayout

+0

을 추가했습니다. public Dimension getPreferredSize() { \t return new Dimension (50,50); }'컨트롤 클래스에서. 그러나 여전히 패널을 렌더링하지는 않습니다. 내가 뭔가 잘못하고 있는거야? – psyc0der

+0

'100'으로 시도하십시오. 왜 50은 작동하지 않는 이유를 알아낼 수 없습니다. –

+2

오우 그 이유는 당신이 그리는 원의 위치 때문입니다. 패널의 크기가 50이고 50으로 그리기 시작하면 원이 패널 크기를 벗어납니다. '0, 0, 50, 50'을 그리면 '50, 50'을 사용할 수 있습니다. 하지만 전체 도면 표면을 원하는만큼 크게 패널 크기를 만들어야합니다. –