JScrollPane не работи с JList

код:

list1items = new DefaultListModel();
list1items.addElement("-");
list1 = new JList(list1items);
list1.setSelectionMode (ListSelectionModel.SINGLE_SELECTION);
list1.setBounds(0,0, 100,100);
JScrollPane list1scr = new JScrollPane(list1);
list1scr.setPreferredSize(new Dimension(20, 20));
list1.setVisibleRowCount(8);
getContentPane().add (list1scr);

И не се появява лента за превъртане. Когато има твърде много елементи, те са скрити, не мога да ги достигна. Как да се реши това?


person John Smith    schedule 20.12.2012    source източник


Отговори (2)


За да разширите отговора на Майкъл Ардан, вие добавяхте JList към панела вместо JScrollPane. JScrollPane трябва да се добави към панела и JList трябва да се добави към ScrollPane, за да работи. Наистина няма нужда да използвате setBounds или setPreferredSize - отървете се от тях. JList се грижи за всичко това, когато извикате метода setVisibleRowCount. Ето пример за работа на вашия ScrollPane. Ако все още имате проблеми, включете свой собствен код в този пример, докато не се повреди. Тогава ни кажете какво го е счупило. Ако не, приемете отговора на Майкъл.

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

public class Temp extends JPanel{
    public Temp(){

        DefaultListModel list1items = new DefaultListModel();
        list1items.addElement("-");
        for(int i = 0; i < 200; i++)
            list1items.addElement("Item " + i);
        JList list1 = new JList(list1items);
        list1.setSelectionMode (ListSelectionModel.SINGLE_SELECTION);
        JScrollPane list1scr = new JScrollPane(list1);
        list1.setVisibleRowCount(8);
        add (list1scr);
    }


    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setContentPane(new Temp());
        frame.pack();
        frame.setVisible(true);
    }
}
person Nick Rippe    schedule 20.12.2012

person    schedule
comment
+1 добра уловка :-) Но най-добре е да изтриете коментара си бързо - общото правило е никога да не правите ръчно оразмеряване/позициониране на компоненти - person kleopatra; 20.12.2012
comment
@kleopatra За бога, може ли някой да ми каже какви биха били последствията от извикването на методи setXXXSize()? - person Branislav Lazic; 20.12.2012
comment
Благодаря @kleo. Както и да е, защо е така? - person Michael 'Maik' Ardan; 20.12.2012
comment
@brano88 всеки JComponents може да връща собствения си PreferredSize, JList има методи за видими редове, за разлика от празните JPanel / JComponent (Painting in Swing не връща никакви Dimension, JPanel е празен за Standard LayoutManagers), тогава трябва да се замени PreferredSize - person mKorbel; 20.12.2012
comment
и какъв е проблемът с абсолютното отравяне? Мислиш, че ще е гадно да го подредя на изток, запад, след запад GAAAAAAAAHHHH - person John Smith; 20.12.2012
comment
@JohnSmith: Абсолютно позициониране не е забранено, но се мащабира лошо както в геометрията, така и в поддръжката. - person trashgod; 20.12.2012
comment
Моля, публикувайте SSCCE за допълнителна помощ. - person Michael 'Maik' Ardan; 20.12.2012
comment
@mKorbel Благодаря за пояснението и съжалявам, че публикувах въпроса си тук. Искам да кажа...избягвам да извиквам методи setXXXSize, но никога не съм срещал проблеми, когато става въпрос за функционалността на моите приложения. - person Branislav Lazic; 20.12.2012