2012-12-02 3 views
1

JFrame에 사용자 정의 스크롤 가능한 JComponent를 추가하려고합니다.사용자 정의 JComponent 크기의 기본값은 0입니까?

JScrollPane sp = new JScrollPane(hg); 
frame.getContentPane().add(sp, BorderLayout.CENTER); 

hg는 사용자 정의 구성 요소입니다.

문제는 내 사용자 지정 구성 요소가 표시되지 않는 것입니다. 그러나 이렇게하면 :

hg.setBounds(0, 0, 800, 600); 

그런 다음 표시됩니다. 물론 크기를 명시 적으로 설정하고 싶지는 않습니다. 프레임의 중앙에 맞추기를 원합니다.

private Dimension computePreferredSize() { 
    return new Dimension((int) (this.getParent().getSize().width * scale), 
      (int) (this.getParent().getSize().height * scale)); 
} 

public Dimension getPreferredSize() { 
    Dimension d = computePreferredSize(); 
    System.out.println("Dimension: " + d); // prints reasonable output: Dimension: java.awt.Dimension[width=1201,height=805] 
    return d; 
} 

을하지만 이것은 어떤 영향을 미칠 것 같지 않습니다 내 사용자 정의 JComponent의 클래스에서

, 나는()로 getPreferredSize 우선합니다. 고정 된 크기를 직접 반환하더라도 :

public Dimension getPreferredSize() { 
    return new Dimension(800, 600); 
} 

이 방법은 작동하지 않습니다.

내 ComponentUI의 paint() 메소드에서도 println을 추가했지만 아무것도 인쇄되지 않으므로 paint()가 호출되지 않은 것으로 생각됩니다. 그 이유는 내 사용자 지정 구성 요소의 크기가 0으로 기본 설정되어 있으며 자체 크기를 조정하는 방법을 모르겠습니다.

내 질문은 : 왜 내 JComponent가 기본적으로 표시되지 않으며 JFrame의 중심에 자동으로 맞춰 지도록해야합니까?

감사합니다.

+0

더 나은 도움을 받으려면 [SSCCE] (http://sscce.org/)를 게시하십시오. –

+0

Andrew, 그것에 대해 말해줘서 고마워 !! –

+1

당신은'paint()'메소드를 언급합니다. 두 가지 : (1)'paintComponent'를'paint'보다 우선 적용하는 것이 좋습니다. 왜냐하면 Swing이 테두리와 물건을 페인트 할 수 있기 때문입니다. (2)'paint (Graphics g)'이어야합니다, 맞습니까? 그렇지 않다면,'paint()'는 결코 호출되지 않을 것이다. 이것이 [@Override] (http://docs.oracle.com/javase/7/docs/api/java/lang/Override.html)가 유용한 이유입니다. – wchargin

답변

4

hg을 정의하는 클래스에서 구성 요소의 기본 크기를 반환하려면 getPreferredSize()을 재정의하십시오. 예는 herehere입니다. 그 이유와 몇 가지 중요한주의 사항은 here으로 논의됩니다.

+1

내용에 따라 ['Scrollable'] 구현 (http://docs.oracle.com/javase/tutorial/uiswing/components/scrollpane.html#scrollable)도 고려하십시오. – trashgod

+0

안녕하세요 trashgod, 신속한 응답을 보내 주셔서 감사합니다! 그러나 나는 이미 방법을 재정의했으나 효과가 없다. 자세한 내용은 수정 된 질문을 참조하십시오. Scrollable도 구현했습니다. –

+0

인용 된 예제에서 작동합니까? ['pack()'] (http://docs.oracle.com/javase/tutorial/uiswing/components/frame.html) 및 [''invokeLater()'] (http://docs.oracle. co.kr/javase/tutorial/uiswing/concurrency/initial.html)? 확실히'@ Override'를 사용하십시오. [sscce] (http://sscce.org/)를 포함하도록 질문을 편집하십시오. – trashgod

관련 문제