Nano Hash - криптовалюты, майнинг, программирование

Почему TextArea setGrowByContent(true) неэффективен, если содержится внутри средства визуализации ячеек списка?

Я хочу отображать Labels и TextArea внутри List именно в списке ячеек. Проблема в том, что даже если я установлю ((TextArea)lData[i]).setGrowByContent(true);, TextArea не увеличится!

Вот коды:

public class CListCellEtapesProspection extends CListCell
{
    private Container cRowYAll = new Container(new BoxLayout(BoxLayout.Y_AXIS));
    private Container row1 = new Container(new BoxLayout(BoxLayout.X_AXIS));
    private Container row2 = new Container(new BoxLayout(BoxLayout.X_AXIS));
    private Container row3 = new Container(new BoxLayout(BoxLayout.X_AXIS));
    private Label[] labels;
    private final int marginR = 5;
    private Font appliFont = MenuPrincipalForm.r.getFont("FontLibelle");
    private int largeurRestant;
    private Component[] lData;

    public CListCellEtapesProspection(String[] libelles, boolean displayHorizontalLine, int formW)
    {
        super(displayHorizontalLine);
        setLayout(new BoxLayout(BoxLayout.Y_AXIS));
        labels = new Label[libelles.length];
        lData = new Component[libelles.length];
        for (int i=0;i<libelles.length;i++)
        {
            labels[i] = new Label(libelles[i]);
            labels[i].setUIID("ListLibelle");

            if (i != 2)
            {
                lData[i] = new Label("");
                lData[i].getStyle().setMargin(Component.TOP, 1);
                lData[i].getStyle().setMargin(Component.BOTTOM, 1);
            }
            else
            {
                lData[i] = new TextArea();
                ((TextArea)lData[i]).getUnselectedStyle().setFont(appliFont, false);
                ((TextArea)lData[i]).getSelectedStyle().setFont(appliFont, false);
                ((TextArea)lData[i]).setPreferredH(appliFont.getHeight()*3);
                ((TextArea)lData[i]).setGrowByContent(true);
            }
        }
        labels[0].setPreferredW(Comparator.max(new int[]{labels[0].getPreferredW(),labels[1].getPreferredW(),labels[2].getPreferredW()}));
        labels[1].setPreferredW(Comparator.max(new int[]{labels[0].getPreferredW(),labels[1].getPreferredW(),labels[2].getPreferredW()}));
        labels[2].setPreferredW(Comparator.max(new int[]{labels[0].getPreferredW(),labels[1].getPreferredW(),labels[2].getPreferredW()}));
        labels[0].getStyle().setMargin(Component.RIGHT, marginR, false);
        labels[1].getStyle().setMargin(Component.RIGHT, marginR, false);
        labels[2].getStyle().setMargin(Component.RIGHT, marginR, false);
        largeurRestant = formW - ( labels[0].getPreferredW() + marginR );
        ((TextArea)lData[2]).setPreferredW(largeurRestant);
        row1.addComponent(labels[0]);
        row1.addComponent(lData[0]);
        row2.addComponent(labels[1]);
        row2.addComponent(lData[1]);
        row3.addComponent(labels[2]);
        row3.addComponent(lData[2]);
        cRowYAll.addComponent(row1);
        cRowYAll.addComponent(row2);
        cRowYAll.addComponent(row3);
        addComponent(cRowYAll);
    }
    public Component getListCellRendererComponent(List list, Object value, int index, boolean isSelected)
    {
        String datetime = null; // 13/05/2003 16h 30mn
        String datetimeFormated = null; // 13/05/2003 - 16h 30mn
        Content entry = null;
        if (value instanceof Content)
            entry = (Content)value;
        if (!"".equals(entry.getColumn(0)))
        {
            ((Label)lData[0]).setText(Formatage.nvl(entry.getColumn(1),"-"));
            datetime = entry.getColumn(2);
            if (!"".equals(datetime))
                datetimeFormated = datetime.substring(0, datetime.indexOf(" ")).concat(" - ").concat(datetime.substring(datetime.indexOf(" ")+1));
            if (!"".equals(datetime))
                ((Label)lData[1]).setText(datetimeFormated);
            else
                ((Label)lData[1]).setText("-");
            ((TextArea)lData[2]).setText(entry.getColumn(3));
        }
        else
        {
            ((Label)lData[0]).setText("-");
            ((Label)lData[1]).setText("-");
            ((TextArea)lData[2]).setText("");
        }
        list.repaint();
        return this;
    }
}

Код суперкласса:

public class CListCell extends Container implements ListCellRenderer {

    private Label focus = new Label("");

    public CListCell(boolean paintHorizontalLine)
    {
        focus.setUIID("bandeau_selection_list");
        if (paintHorizontalLine)
            getStyle().setBgPainter(new LigneHorizontalPainter(this, 13553358));
    }

    public Component getListCellRendererComponent(List list, Object value, int index, boolean isSelected)
    {
        return this;
    }

    public Component getListFocusComponent(List arg0)
    {
        return focus;
    }
}

Так почему же TextArea не растет, когда данные представляют собой длинные строковые данные?


Ответы:


1

Вам нужно прочитать о рендерерах списков. Рендеры имеют единый размер, что определяется достаточно сложной логикой при инициализации списка или изменении модели.

Взгляните на ContainerList или просто используйте контейнер с компонентами внутри него.

05.01.2012

2

@Шай, у меня тоже была такая проблема. не было обходного пути, и мой пользовательский рендерер списка имел макет таблицы, содержащий текстовую область и три метки. Я думаю, что лучше (наиболее последовательно) использовать контейнер с компонентами в нем (который прокручивается довольно медленно и лениво перемещает фокус для больших моделей).

29.05.2012
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..