Сделать JScrollPane отображать полосы прокрутки, когда JList внутри изменяется - PullRequest
5 голосов
/ 04 мая 2009

Я пытаюсь динамически изменить JList внутри JScrollPane, используя

myList.setListData(someArray);

После этого я ожидал бы, что JScrollPane будет показывать полосы прокрутки по мере необходимости, но этого не происходит. Поиск в Google не очень помог. Я пробовал различные комбинации следующих методов, но с небольшим успехом (в основном, используя API-интерфейсы):

myScrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
myList.validate(); myScrollPane.validate();
myScrollPane.setPreferredSize(Dimension someDimension);
myScrollPane.setViewportView(moduleList);
myScrollPane.setLayout(...);

При использовании первого метода появляется полоса прокрутки, но она не активируется при изменении модели. Я также подключился к PropertyChangeEvent и проверил, что JList запускает и событие, когда модель изменилась. Что мне здесь не хватает? Какой метод я должен использовать, чтобы заставить это работать, или даже лучше, какое свойство сделало бы эту работу из коробки?

Ответы [ 5 ]

9 голосов
/ 11 ноября 2009

, если предпочитаемый размер установлен в JList, даже если (0, 0), тогда JScrollPane не работает - убедитесь, что он не установлен, setPreferredSize (null), если необходимо

см. mrtextminer следующим образом

Решение этой проблемы состоит в том, чтобы не задавать предпочитаемый размер JList (удаляя оператор настройки). В среде IDE Netbeans 5.5.1 можно сбросить значение предпочитаемого размера JList, щелкнув правой кнопкой мыши свойство предпочтительного размера в JList и выбрав «восстановление значения по умолчанию».

В заключение, установите предпочитаемый размер только для JScrollPane. Не устанавливайте предпочитаемый размер JList.

3 голосов
/ 04 мая 2009

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

public class Frametest {

private JList list;

public Frametest() {
    JFrame f = new JFrame("Scrollable JList");
    f.setSize(200, 300);
    JScrollPane jsp = new JScrollPane();        
    list = new JList();
    jsp.getViewport().add(list);
    f.getContentPane().setLayout(new BorderLayout());
    f.getContentPane().add(jsp, BorderLayout.CENTER);
    JButton button = new JButton("update");
    button.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {
            Object[] objects = new Object[20];
            for(int i=0; i<20; i++) {
                objects[i] = "foo foo foo foo foo foo foo foo foo foo foo foo "+i;
            }
            list.setListData(objects);
        }
    });
    f.getContentPane().add(button, BorderLayout.SOUTH);
    f.setVisible(true);     
}

public static void main(String[] args) {
    new Frametest();
}}
2 голосов
/ 04 мая 2009

Вы пытались вызвать validate или revalidate метод JList после внесения изменений в данные списка?

myList.setListData(someArray);
myList.revalidate();

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

Вызов revalidate на myList не только проверяет сам список, но также проверяет область прокрутки, поэтому влияет на видимость полосы прокрутки в зависимости от элементов, отображаемых в списке.

1 голос
/ 17 февраля 2011

, если вам все еще нужно это, попробуйте удалить методы проверки, и если у вас есть setpreferredsize, удалите его, вот как мой испортился

Я удалил

resultList.setPreferredSize(resultList.getPreferredSize());

и готово

1 голос
/ 08 мая 2009

Это выглядит неправильно:

jsp.getViewport().add(list);

Вместо этого используйте:

jsp.setViewportView(list);

или

new JScrollPane(list);

и список будет правильно добавлен в область прокрутки. Добавив его таким образом, вы можете прослушать изменения на панели прокрутки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...