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();
    }
}

Итак, это то, где я нахожусь. Я получу свиток, но он позволит мне прокрутить только на 1 мм. И если я удалю 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 компонентов в цикле.


person Daniel Wennberg    schedule 24.03.2013    source источник


Ответы (2)


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

Не используйте методы setBounds() для своих компонентов.

Swing был разработан для использования с менеджерами компоновки. Полосы прокрутки появятся автоматически, когда предпочтительный размер компонентов, добавленных в область прокрутки, превысит размер области прокрутки. Менеджеры макетов делают эти расчеты за вас.

Дополнительную информацию см. в разделе руководства по Swing Использование менеджеров компоновки. Информация и примеры.

person camickr    schedule 24.03.2013
comment
Я не знаю, как запустить панель прокрутки без setbound. если удалить его, он уходит. Странная вещь с setbounds заключается в том, что если у вас есть высота 400 и вы играете, прокрутки нет. но если я уменьшу его до значения ниже 400, я смогу прокрутить вниз до 400. Где-то я нашел способ отследить эту незначительную проблему.. - person Daniel Wennberg; 25.03.2013
comment
if a remove it it goes away. Не используйте нулевой макет!!! Менеджер компоновки установит размер всех компонентов. - person camickr; 25.03.2013

В дополнение к отличному совету, данному Робом Камиком, вы также удаляете все компоненты непосредственно из JScrollPane и пытаетесь добавить компоненты непосредственно в JScrollPane, игнорируя то, что JViewport не следует путать и что визуализированные компоненты необходимо добавлять в окно просмотра JScrollPane. , а не к самой JScrollPane.

Таким образом, вы можете добавить компонент в область просмотра JScrollPane, передав его в конструктор JScrollPane, или вместо этого вы можете вызвать метод setViewportView(...) JScrollPane, если хотите поменять местами представления, которые он содержит.

Кроме того, попробуйте использовать лучшие имена переменных, имена, которые соответствуют стандартам именования Java (например, имена переменных должны начинаться с буквы нижнего регистра), и имена, которые имеют смысл, что делает ваш код самокомментирующим. Имя переменной B не соответствует ни одной из этих рекомендаций.

Кроме того, во всей вашей программе отсутствуют приличные менеджеры компоновки. Похоже, вы хотите добавить несколько компонентов в JScrollPane. Рассмотрите возможность создания JPanel, удерживаемого окном просмотра JScrollPane, придания ему соответствующего макета, возможно, GridLayout(....) и добавления нескольких компонентов в этот JPanel.

Для получения более конкретной и информативной справки рассмотрите возможность создания и публикации SSCCE.

person Hovercraft Full Of Eels    schedule 24.03.2013
comment
+1, за правильное использование имен переменных области прокрутки/просмотра и Java. Я перестал читать, заметив проблему setBounds(..). - person camickr; 25.03.2013
comment
@camickr: спасибо. и 1+ (присвоено 3 часа назад) за ваши отличные рекомендации. - person Hovercraft Full Of Eels; 25.03.2013
comment
Спасибо за ввод. Я все еще новичок в программировании, и, поскольку я расстраиваюсь, все больше и больше попадает в переменные. я сделаю лучше. Я постараюсь внести изменения, рекомендованные сегодня, и вернуться. - person Daniel Wennberg; 25.03.2013