2012-08-16 2 views
4

절대 레이아웃이있는 JScrollPane을 사용해야합니다. 나는 setLayout (null)의 사용이 전혀 권장되지 않는다는 것을 알고있다. JScrollPane에 절대 레이아웃을 사용하려면 JScrollPane에서 크기를 계산할 수 있도록 요소의 기본 크기 속성을 설정해야합니다.JScrollPane 내에서 절대 레이아웃 사용

나는 elemnts의 순서와 크기를 변경하려고 다음 코드를 시도했지만 잘못된 부분을 해결할 수는 없다.

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.EventQueue; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 


public class frame extends JFrame { 

private JPanel contentPane; 
private JScrollPane scrollPane; 

public static void main(String[] args) { 
    EventQueue.invokeLater(new Runnable() { 
     public void run() { 
      try { 
       frame frame = new frame(); 
       frame.setVisible(true); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    }); 
} 

public frame() { 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setBounds(100, 100, 450, 300); 
    contentPane = new JPanel(); 
    contentPane.setLayout(null); 
    setContentPane(contentPane); 

    JPanel panel = new JPanel(); 
    panel.setBackground(Color.red); 
    panel.setBounds(0,0,600,600); 
    panel.setPreferredSize(new Dimension(420,280)); 

    scrollPane = new JScrollPane(panel); 
    scrollPane.setBounds(0, 0, 600, 600); 
    scrollPane.setLayout(null); 
    scrollPane.setBackground(Color.green); 

    scrollPane.add(panel); 
    scrollPane.setPreferredSize(new Dimension(450,300)); 
    contentPane.add(scrollPane); 
} 
} 

setPreferredSize가 올바른 작업을 수행하지 않는 이유는 무엇입니까? 미리 감사드립니다.

+0

['ScrollPanePaint'] (http://stackoverflow.com/a/10097538/230513)도 참조하십시오. – trashgod

+0

a) 절대 null 레이아웃 (결코 : LayoutManager 없음)을 사용하지 마십시오. b) 절대로 setXXSize를 사용하지 마십시오. – kleopatra

답변

4

실제 JScrollPane의 레이아웃 관리자를 변경하는 것은 의미가 없습니다. 응용 프로그램에서 절대 레이아웃을 사용하려면 일반적으로 JPanel과 같은 컨테이너 클래스에서 setLayout(null)을 호출하여 절대 위치 지정을 사용하여 하위 구성 요소를 배치합니다.

  • 전화 setLayout(null)JScrollPane에 포함 된 JPanel에 (나는 이것이 당신이 뭘 하려는지입니다 생각 로) :

    나는 당신이 시도해야하는 것이 좋습니다.

  • JPanel을 직접 사용하지 말고 하위 클래스로 만들고 JScrollPane에 최적의 스크롤 가능한 뷰포트 크기에 대한 추가 정보를 제공하는 Scrollable 인터페이스를 구현하십시오. 당신이

    둘째를 달성하기 위해 원하는 것을, 창은 JViewport 불구하고 작동하는 스크롤에 대한 모든

5

먼저, 스크롤 창의 레이아웃 매니저를 변경하지 마십시오, 그것은 필요 아닙니다. 대신 셋째, 당신은 스크롤 창 그냥 적절한 사이즈에 의존하지 않는 한 Scrollable 인터페이스에서 살펴 봐야 할 scrollPane.setViewportView(panel)

를 사용 (scrollPane.add(panel)이 할 수있는 잘못된 일이다) 대신에 컨테이너를 추가해야 그 내용의

2

나는 당신의 문제를 볼 수있다.

여기에서는 패널의 경계 및 기본 크기를 설정합니다. 다음

panel.setBounds(0,0,600,600); 
panel.setPreferredSize(new Dimension(420,280)); 

당신이 스크롤

scrollPane.setBounds(0, 0, 600, 600); 

음의 경계 설정 패널의 경계가 쓸모, 스크롤은 적절한 사이즈에 대한 관심 유발 및 패널의 추천 사이즈가 작 scrollPanel의 경계는 scrollPanel이 다른 것을 보여줄 필요가 없다고 생각하므로 스크롤바를 표시하거나 사용하지 않는 이유입니다. OBS : scrollPanel의 레이아웃을 설정할 때 아무런 의미가 없습니다. 그래서 그 줄을 건너 뛸 수 있습니다.

마찬가지로 주석으로 : 절대 레이아웃 창과 함께 스크롤을 사용하면 창의 기본 크기를 관리하기 때문에 문제가 없습니다.