JList с JScrollPane и прототипом значения ячейки переносит имена элементов (заменяет точки вместо отображения горизонтальной полосы прокрутки), почему? - PullRequest
0 голосов
/ 27 апреля 2010

У меня есть Jlist внутри JScrollPane, и я установил значение прототипа, чтобы он не вычислял ширину для больших списков, а просто использует эту ширину по умолчанию.

Теперь проблема в том, что Jlist по какой-то причине заменяет конец элемента точками (...), чтобы горизонтальная полоса прокрутки никогда не отображалась.

Как отключить с помощью "обтекания"? Чтобы длинные элементы не заменялись точками, если они шире ширины Jlist?

Я воспроизвел проблему в небольшом примере приложения. Пожалуйста, запустите его, если вы не понимаете, что я имею в виду:

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

public class Test
{
    //window
    private static final int windowWidth = 450;
    private static final int windowHeight = 500;

    //components
    private JFrame frame;
    private JList classesList;
    private DefaultListModel classesListModel;

    public Test()
    {
        load();
    }

    private void load()
    {   
        //create window
        frame = new JFrame("Test");
        frame.setSize(windowWidth, windowHeight);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setUndecorated(true);
        frame.getRootPane().setWindowDecorationStyle(JRootPane.PLAIN_DIALOG);

        //classes list
        classesListModel = new DefaultListModel();
        classesList = new JList(classesListModel);
        classesList.setPrototypeCellValue("prototype value");
        classesList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        classesList.setVisibleRowCount(20);
        JScrollPane scrollClasses = new JScrollPane(classesList, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);     

        for (int i = 0; i < 200; i++)
        {
            classesListModel.addElement("this is a long string, does not fit in width");
        }

        //panel
        JPanel drawingArea = new JPanel();
        drawingArea.setBackground(Color.white);

        drawingArea.add(scrollClasses);
        frame.add(drawingArea);

        //set visible
        frame.setVisible(true);
    }
}

Даже если вы нажмете горизонтальную полосу прокрутки, вы все равно не сможете прокрутить, потому что элемент на самом деле не шире ширины из-за переноса точки (...).

Заранее спасибо.

Ответы [ 3 ]

3 голосов
/ 28 апреля 2010

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

Используя метод setPrototypeCellValue (...), вы влияете на способ расчета списком своего предпочтительного размера, что означает, что вы несете ответственность за предоставление правильного значения, гарантирующего, что строки не будут усечены.

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

2 голосов
/ 21 октября 2010

Мой ответ на этот вопрос заключается в том, что сначала найдите самый длинный элемент в списке, затем используйте метод setPrototype для этих элементов

1 голос
/ 28 апреля 2010

Когда вы вызываете classesList.setPrototypeCellValue("prototype value"), вы говорите JList classesList ограничить его максимальную ширину длиной строки «значение прототипа». ( см. Javadocs )

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

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

Если вы закомментируете

classesList.setPrototypeCellValue("prototype value");

или замените его на

classesList.setPrototypeCellValue("this is a long string, does not fit in width");

тогда он будет работать так, как вы ожидали.

...