2013-03-24 2 views
1

내 코드에서 동적으로 채우는 scrollPane이 있습니다. 문제는 내가 범위에서 성장할 수 없다는 것입니다.scrollPane에서 스크롤바를 가져올 수 없습니다.

나는 온라인에서 찾을 수있는 많은 팁을 시도했지만 아무 것도 나타나지 않습니다.

10 개의 구성 요소가 반복되지만 크기는 항상 동일합니다.

B = new JScrollPane(); 
    B.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS); 
     B.setViewportBorder(null); 

      B.setBounds(12, 53, 330, 400); 

     //making the scrollPane 

     loadArtists(country); 


     // loading the method with the content 


    contentPane.add(B); 

     // the content method 

       public void loadArtists(String country){ 
    ArrayList<Artist> top10A = Methods.getTopArtist(country); // top atrister 

    B.removeAll(); 

    String [] genre =Methods.getGenreArtist(country);           
    Component2[] comp = new Component2[10]; // skriv ut infohållare 

    for (int i = 0; i < top10A.size(); i++) { 
     comp[i] = new Component2(this); 
     comp[i].setBounds(0, 0, 327, 68); 
     comp[i].setLocation(0, 0 + space2); 
     ImageIcon[] panel= new ImageIcon[10]; 

     int lyssnare = top10A.get(0).getListeners(); 

     try { 
       URL url2 = new    URL((top10A.get(i).getImageURL(ImageSize.valueOf("MEDIUM")))); 
       panel[i]= new ImageIcon(url2); 
      } catch (MalformedURLException e) { 
       // TODO Auto-generated catch block 
       panel[i]= new ImageIcon(GUI.class.getResource("/bilder/super.jpg")); 
       e.printStackTrace(); 

      } 

     comp[i].setInfo(panel[i],top10A.get(i).getListeners(), top10A.get(i).getName().toString(), String.valueOf(i+1),genre[i],lyssnare,""); 

     B.add(comp[i]); 
     space2 = space2 + 75; 

       //B.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); 

     B.repaint(); 
    } 
} 

좋아, 그럼 내가 그랬어. 나는 두루마리를 얻을 것이다. 그러나 그것은 단지 나를 1mm 두루마리하게하게했다. 그리고 setBounds를 제거하면 전체 스크롤 패널이 사라집니다. 나는 그 문제를 해결하는 방법을 모른다. 죄송합니다. 약간 부끄러 웠지만 이것이 내 첫 "실제 프로그램"입니다.

scroll1 = new JScrollPane(); 
    scroll1.setViewportBorder(null); 

     scroll1.setBounds(12, 53, 330, 400); 

      setComponents = new JPanel(); 

contentPane.add(scroll1); 


scroll1.setViewportView(setComponents); 
GroupLayout gl_testP = new GroupLayout(setComponents); 
gl_testP.setHorizontalGroup(
    gl_testP.createParallelGroup(Alignment.LEADING) 
     .addGap(0, 307, Short.MAX_VALUE) 
); 
gl_testP.setVerticalGroup(
    gl_testP.createParallelGroup(Alignment.LEADING) 
     .addGap(0, 398, Short.MAX_VALUE) 
); 
setComponents.setLayout(gl_testP); 

loadArtists(country);  




public void loadArtists(String country){ 
    ArrayList<Artist> top10A = Methods.getTopArtist(country); // top atrister 

    setComponents.removeAll(); 

    String [] genre =Methods.getGenreArtist(country);           
    Component2[] comp = new Component2[10]; // skriv ut infohållare 

    for (int i = 0; i < top10A.size(); i++) { 
     comp[i] = new Component2(this); 
     comp[i].setBounds(0, 0, 327, 68); 
     comp[i].setLocation(0, 0 + space2); 
     ImageIcon[] panel= new ImageIcon[10]; 

     int lyssnare = top10A.get(0).getListeners(); 

     try { 
       URL url2 = new URL((top10A.get(i).getImageURL(ImageSize.valueOf("MEDIUM")))); // skapa array av artist bilder 
       panel[i]= new ImageIcon(url2); 
      } catch (MalformedURLException e) { 
       // TODO Auto-generated catch block 
       panel[i]= new ImageIcon(GUI.class.getResource("/bilder/super.jpg")); 
       e.printStackTrace(); 
       System.out.println(panel[i]+" "+"saknar bild"); 
      } 

     comp[i].setInfo(panel[i],top10A.get(i).getListeners(), top10A.get(i).getName().toString(), String.valueOf(i+1),genre[i],lyssnare,""); 


     setComponents.add(comp[i]); 
     space2 = space2 + 75; 
     scroll1.setViewportView(setComponents); 

     //B.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); 

     setComponents.repaint(); 
    } 
} 

확인. 그래서 나는 그것을 "고쳤다".

  setComponents.setPreferredSize(new Dimension(1,750)); 

콘텐츠가 동적으로 커지기 때문에 최적이 아닙니다. 하지만 이제는 10 개 이상의 구성 요소를 반복 할 필요가 없을 때 실제로는 별다른 문제가되지 않습니다.

답변

4
B.setBounds(12, 53, 330, 400); 

구성 요소에 setBounds() 메서드를 사용하지 마십시오.

스윙은 레이아웃 관리자와 함께 사용하도록 설계되었습니다. 스크롤 막대에 추가 된 구성 요소의 기본 크기가 스크롤 창의 크기보다 클 경우 자동으로 스크롤 막대가 나타납니다. 레이아웃 관리자는 이러한 계산을 수행합니다.

자세한 내용과 예제는 Using Layout Managers의 스윙 튜토리얼 섹션을 참조하십시오.

+0

나는 setbound없이 scrollpane을 시작하는 방법을 모른다. 그것을 제거하면 사라집니다. setbounds를 가진 wierd 것은 400에 높이가 있고 놀이가 아무도없는 경우에 저것이다. 하지만 내가 400 이하로 내려갈 수 있다면 400까지 내려갈 수있을 것입니다. 어딘가에이 사소한 일을 해결하려고 노력하는 길을 가졌습니다. –

+0

'그것을 제거하면 제거됩니다. ' null 레이아웃을 사용하지 마십시오!레이아웃 관리자는 모든 구성 요소의 크기를 설정합니다. – camickr

3

Rob Camick이 제공 한 훌륭한 조언 외에도 JViewport가 엉망이되어서는 안되며 시각화 된 구성 요소를 추가해야한다는 것을 무시하고 JScrollPane에서 직접 모든 구성 요소를 직접 제거하고 추가하려고합니다 JScrollPane 자신의 뷰가 아닌 JScrollPane의 뷰포트에 전달합니다.

JScrollPane의 뷰포트에 JScrollPane의 생성자에 구성 요소를 전달하여 구성 요소를 추가하거나 보유한 뷰를 교체하려는 경우 JScrollPane의 setViewportView(...) 메서드를 대신 호출 할 수 있습니다.

제쳐두고 더 나은 변수 이름, Java 명명 표준 (예 : 변수 이름은 소문자로 시작해야 함)을 준수하는 이름을 사용하고 코드를 자체 주석으로 작성하는 이름을 사용하십시오. . 변수 이름 B는이 권장 사항 중 하나를 준수하지 않습니다.

전체 프로그램에도 알맞은 레이아웃 관리자가 부족합니다. JScrollPane에 여러 구성 요소를 추가하려는 것 같습니다. JScrollPane의 뷰포트가 보관 유지하는 JPanel를 작성해, 적절한 레이아웃 (경우에 따라서는 GridLayout (...))을 지정해,이 JPanel에 복수의 컴퍼넌트를 추가하는 것을 고려해주세요.

보다 구체적이고 유익한 도움이 필요하면 SSCCE 작성 및 게시를 고려하십시오.

+0

+1, scrollpane/viewport 및 Java 변수 이름을 올바르게 사용합니다. 나는 setBounds (..) 문제를 알아 차리고 독서를 멈췄다. – camickr

+0

@camickr : 감사합니다. 및 1+ (3 시간 전)를 추천합니다. 입력에 대해 –

+0

고맙습니다. 임씨는 프로그래밍에 익숙하지 않고 좌절감을 느낄수록 변수가 더 많이 생깁니다. 나는 더 잘할 것이다. 오늘 권장되는 변경 사항을 구현하려고 노력할 것입니다. –