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
Спасибо @клео. В любом случае, почему это? - 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
а причем тут абсолютное отравление? Вы думаете, я буду сосать с расположением его на восток, запад, после запада ГААААААААААААААААААААААААА - 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