2014-10-19 6 views
0

절대 레이아웃이있는 패널을 사용하고 있습니다. 이유를 묻지 마십시오. 프로그래밍 방식으로 요소를 추가해야합니다. 나는 그 부분을했지만 지금은 JScrollPane으로 패널을 둘러 쌈으로써 사용자가 더 많은 항목을 추가 할 때 스크롤 막대가 해당 작업을 수행하도록합니다. 스크롤바가있는 주변 패널은 작동하지 않습니다. 나는 여기서 무엇을 할 수 있는가.JScrollPane 내의 절대 레이아웃 패널

JFrame frame = new JFrame(); 
    frame.setSize(582, 451); 
    frame.setLocationRelativeTo(null); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.getContentPane().setLayout(null); 

    JScrollPane scrollPane = new JScrollPane(); 
    scrollPane.setBounds(10, 11, 546, 391); 
    frame.getContentPane().add(scrollPane); 

    JPanel panel = new JPanel(); 
    scrollPane.setViewportView(panel); 
    panel.setLayout(null); 




for(int i=0;i<labelList.size();i++){ 
     if(a==4){ 
      a=0; 
      b++; 
     } 
     labelList.get(i).setBounds(10+120*a+10*a, 10+130*b+10*b, 120, 130); 
     labelList.get(i).setOpaque(true); 
     labelList.get(i).setBackground(Color.WHITE); 
     labelList.get(i).setText(Integer.toString(i)); 
     panel.add(labelList.get(i)); 
     a++; 
    } 
+1

'절대 레이아웃이있는 패널을 사용하고 있습니다. (왜 묻지 마십시오.)'- ** 자원 봉사자에게 ** 도움을 요청하고 있으므로 도움을주기 위해선 안됩니다 . 스윙 경험이있는 대부분의 사람들에게 분명한 질문은 절대 레이아웃을 사용하려는 이유입니다. 당신의 질문은 우리가 이것을 묻지 못한다고 규정했기 때문에 나는 절을 할 것입니다. 도움이 될만한 사람이 있으면 도움을 얻을 수 있지만 도움이 될 확률을 높이려면 문제와 밀접한 관련이 있으므로 요구 사항에 대해 조금만 설명하면 도움이됩니다. –

+1

JPanel에서 유효한 레이아웃 관리자를 사용하면 더 많은 구성 요소가 추가 될 때 ** preferredSize **가 자동으로 증가하고 유효성이 다시 확인됩니다 (레이아웃에 구성 요소를 다시 레이아웃하라는 메시지가 표시됨). null JPanel은 이것을하지 않으므로 JScrollPane은 작동하지 않습니다. –

+0

@Hover 나는 아무도 나를 도우려고하지 않습니다. 나는 누군가가 내가 좋아하는 방식으로 해결하려고 노력하는 문제의 해결책을 가지고 있는지 묻는다. "이유를 묻지 말라"는 비우호적이라고 언급되지 않은 것은 모든 사람이 "절대적인 레이아웃을 사용하지 마십시오"와 같이 대답 할 것이기 때문입니다. 그것은 2 미터 거리에서 누군가 TV를 시청하고 누군가가 걷지 않고 프로그램을 전환하는 것을 도울 수 있는지 묻습니다. 누군가는 "왜 당신이 일어나서 프로그램을 수동으로 바꾸지 않겠습니까?"라고 말합니다. 이를 방지하기 위해 사람 A는 "프로그램을 시작할 수있게 전환 할 수 있음을 알려주지 않습니다. 이미 알고 있습니다."라고 덧붙입니다. 재생 해줘서 고마워. –

답변

2

당신은 내 대답을 좋아하지 않을거야,하지만 난 우리가 당신에게 당신이 듣고 싶은 것을 항상되지 않습니다 최고의 대답을 제공하도록 강요해야한다고 생각합니다. 이것이 바로 레이아웃 관리자를 사용하여 구성 요소 레이아웃을 수행하는 것입니다. 그렇습니다. 초보자에게는 null 레이아웃이 가장 사용하기 쉬운 것처럼 보일 수 있지만 경험이 많을수록 정반대 인 것을 알게 될 것입니다. 널 (Null) 레이아웃을 사용하면 매우 유연하지 않은 GUI를 만들 수 있습니다. 다른 플랫폼이나 화면 해상도에서보기 좋게 보일 수도 있지만 업데이트 및 유지 관리가 매우 어렵습니다. 대신 레이아웃 관리자를 배우고 배우고 각각의 레이아웃 관리자를 사용하여 JPanels를 중첩하여 모든 OS에서 잘 보이는 기발하고 복잡한 GUI를 만들 수 있습니다.

간편한 사용을 위해 널 레이아웃으로 복잡한 GUI를 작성한 다음 나중에이 GUI의 중간에 구성 요소를 추가하십시오. 이렇게하면 새 구성 요소 왼쪽 또는 아래에 추가 된 구성 요소의 위치와 크기를 수동으로 다시 계산해야하므로 많은 오류가 발생할 수 있습니다. 레이아웃 관리자는 모두 자동으로이 작업을 수행합니다.

특히 유효한 레이아웃 관리자를 사용하면 더 많은 구성 요소가 추가되고 JPanel의 유효성이 다시 검사됨에 따라 JPanel의 preferredSize가 자동으로 증가합니다 (레이아웃에 구성 요소를 다시 레이아웃하라는 메시지가 표시됨). null JPanel은 이것을하지 않으므로 JScrollPane은 작동하지 않습니다. 예, 해결 방법은 수동으로 JPanel의 preferredSize를 계산하고 설정하는 것이지만 위와 같은 이유로 위험하므로 권장되지 않습니다.

+0

아니요, 답장을 좋아하고 완전히 옳습니다. 프로그램에서 누군가가 레이아웃 관리자를 사용할 때 코드를 실행하는 동안 모든 관리자가 정확히 픽셀에 의존합니까? 예를 들어 레이아웃 관리자로 패널에 레이블을 추가하면 Java 실제 픽셀 수준에서이를 수행 할 수 있으며 관리자의 사용은 프로그래머가 자신의 작업을 쉽게 수행 할 수 있도록 만듭니 까? –

+0

@ ЂорђеЂашић : 나는 당신의 질문을 완전히 이해하고 있는지 확신하지 못합니다. 관리자는 일반적으로 서로 상대적인 구성 요소와 관리자에게주는 규정을 배치합니다. FlowLayout, BorderLayout, GridLayout, BoxLayout, GridBagLayout 등과 같은 각 레이아웃 관리자 유형은 다른 것들과 다르게 작동합니다. –

+0

예제로 설명하려고합니다. 인스턴스 패널과 레이블이 있습니다. BorderLayout을 사용하여이 레이블을 패널에 추가하려면 panel.add (label)를 사용합니다. 이 뒤에는 메소드 add (Component c)의 정의에서 panel.add (label, x, y)와 같이 유지됩니다. 여기서 x와 y는 패널의 픽셀 위치입니다. 내 말은, BorderLayout이 AbsoluteLayout을 사용하고있는 것인가? –