JList - использовать вертикальную полосу прокрутки вместо горизонтальной с вертикальной ориентацией переноса? - PullRequest
8 голосов
/ 02 февраля 2012

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

A D G
B E H
C F 

Однако, когда JList заканчиваетсяЧтобы отобразить больше записей, я бы хотел, чтобы JScrollPane прокручивал только в вертикальном направлении.

Это работает, когда я использую VERTICAL_WRAP.Однако, похоже, что когда я использую вертикальную перенос, я получаю горизонтальную полосу прокрутки, а когда я использую HORIZONTAL_WRAP, я получаю нужную полосу прокрутки, но элементы располагаются в порядке, который мне не нравится.Могу ли я взять свой торт и съесть его тоже?Вот простой пример того, что я пытаюсь сделать.

enter image description here

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

public class ScrollListExample {
    static List<String> stringList = new ArrayList<String>();
    static {
        for (int i = 0; i < 500; i++) {
            stringList.add("test" + i);
        }
    }

    public static void main(final String[] args) {
        final JFrame frame = new JFrame();
        final Container contentPane = frame.getContentPane();
        final JList list = new JList(stringList.toArray());
        list.setLayoutOrientation(JList.VERTICAL_WRAP);
        list.setVisibleRowCount(0);
        final JScrollPane scrollPane = new JScrollPane(list);
        contentPane.add(scrollPane);
        frame.setPreferredSize(new Dimension(800, 400));
        frame.pack();
        frame.setVisible(true);
    }
}

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

Ответы [ 3 ]

2 голосов
/ 03 февраля 2012

Я думаю, что ваше решение просто отлично, а не взломать вообще.Любая встроенная функция в любом случае должна была бы делать в основном одно и то же.

Вот модификация вашего примера, которая делает то, что вы хотите.

0 голосов
/ 29 ноября 2012

Brilliant Code @Kevin K ... Я предлагаю небольшую модификацию, чтобы избежать ArithmeticException (Divide to zero)

private int computeVisibleColumnCount(JList list) 
    {
        int cellWidth = list.getCellBounds(0, 0).width;
        int width = list.getVisibleRect().width;
        return width == 0 ? 1 : width / cellWidth;
    }
0 голосов
/ 03 февраля 2012

Это то, что вы собираетесь? (Возможно, нужно изменить предпочтительный размер ...)

public class ScrollListExample {
    static List<String> stringList = new ArrayList<String>();
    static {
        for (int i = 0; i < 500; i++) {
            stringList.add("test" + i);
        }
    }

    public static void main(final String[] args) {
        final JFrame frame = new JFrame();
        final Container contentPane = frame.getContentPane();
        final JList list = new JList(stringList.toArray());
        final JScrollPane scrollPane = new JScrollPane(list);
        scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
       scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
        contentPane.add(scrollPane);
        frame.setPreferredSize(new Dimension(200,200));
        frame.pack();
        frame.setVisible(true);
    }
}
...