2016-06-10 4 views
1

이 코드를 실행하면 매우 이상한 동작이 발생합니다. 실행 중일 때 크기 조정 및 타이핑을 시도하여 의미를 확인하십시오. 이 하나 개의 라인으로JScrollPane에 구성 요소를 추가하면 이상한 동작이 발생합니다.

JScrollPane scrollPane = new JScrollPane(); 
    scrollPane.add(jPanel); 

을하고 동작이 예상대로 : 이제

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

public class FrameWithScrollPanel extends JFrame { 
public static void main(String[] args) { 
    FrameWithScrollPanel myFrame = new FrameWithScrollPanel(); 
} 


public FrameWithScrollPanel() 
{ 
    this.setDefaultCloseOperation(EXIT_ON_CLOSE); 
    JTextArea textArea1 = new JTextArea(5, 30); 
    JTextArea textArea2 = new JTextArea(5, 30); 

    JPanel jPanel = new JPanel(); 
    jPanel.setSize(400,400); 
    jPanel.setLayout(new BorderLayout()); 
    jPanel.add(textArea1, BorderLayout.NORTH); 
    jPanel.add(textArea2, BorderLayout.SOUTH); 

    JScrollPane scrollPane = new JScrollPane(); 
    scrollPane.add(jPanel); 
    getContentPane().add(scrollPane, BorderLayout.CENTER); 
    pack(); 
    setVisible(true); 
} 
} 

이 2 개 라인을 교체합니다.

JScrollPane scrollPane = new JScrollPane(jPanel); 

설명서에 따라 JScrollPane 생성자는 Component를 받아들이므로 add()도 마찬가지입니다. 왜 행동의 차이가 있습니까?

답변

2

이것은 잘못된 것입니다 :

scrollPane.add(jPanel); 

당신이 추가로 JScrollPane의의 모든 중요한 뷰포트를 대체 작동을 방지하고 있기 때문에. 대신 JScrollPane tutorialJScrollPane API 당으로가 JScrollPane의 뷰포트에이를 추가해야합니다

scrollPane.setViewportView(jPanel); 

또는 도덕 이야기의

scrollPane.getViewport().add(jPanel); 

: 의심이의 문서를 참조하십시오. 당신이 JScrollPane의 생성자에 JPanel의를 통과하면 것을

주, 자동으로 당신을 위해 뷰포트에 구성 요소를 배치

JScrollPane scrollPane = new JScrollPane(jPanel); 

. 구성 요소의 컨텐츠가 뷰보다 큰 때마다

공공 JScrollPane의 (구성 요소보기)
는 수평 및 수직 스크롤이 모두 표시 지정된 컴퍼넌트의 컨텐츠를 표시하는 JScrollPane를 작성합니다 : API를 당

.
매개 변수 :
보기 - 스크롤 구획의 뷰포트

+0

감사에 표시하는 구성 요소입니다. 실제로 JScrollPane API에 대한 링크를 읽고 있었지만 대부분의 구성 요소가 add()를 사용하여 다른 패널에 추가 된 것 같기 때문에 JScrollPane은 add()가 대신 뷰포트를 대체하는 유일한 고유 한 JScrollPane입니다. 그것에 대한 추가 사항? –

+0

@UnhandledException : JScrollPane는, 몇개의 서브 컴퍼넌트에 의해 구축 된 복잡한 컴퍼넌트입니다. 배제하고있는 중요한 것이 뷰포트입니다. 다른 구성 요소 구성 요소에는 여러 구성 요소로 구성된 JFrames와 같은 최상위 창을 포함 할 때주의해야합니다. 예를 들어 JFrame에서'setBackground (Color c)'를 호출하면 배경색이 변경되지 않습니다. 원하는 효과를 얻으려면 JFrame의 contentPane에서 메서드를 호출해야합니다. 그리고 JFrame에서'add (Component comp)'를 호출하면 실제로 contentPane에 추가됩니다. –

관련 문제