Хобрук: Ваш путь к мастерству в программировании

Пользовательский ListCell HGrow для JavaFX

У меня есть ListView с пользовательским ListCellFactory. В моей реализации CustomListCell я использую setGraphic, чтобы установить графику элемента списка в GridPane, но я не могу не позволить GridPane заполнить всю ширину ListView. Ниже приведена краткая версия моего кода:

class MyListCell extends ListCell<MyObject>
{
    private final GridPane _myComponent;

    public MyListCell()
    {
        ...
        setContentDisplay(ContentDisplay.GRAPHIC_ONLY); // does not help
        //this.setPrefWidth(0); // does not help
        myComponent.prefWidthProperty().bind(this.widthProperty()); // does not help
    }

    ...

    @Override
    protected void updateItem(MyObject item, boolean empty)
    {
        ...
        setGraphic(_myComponent);
        ...
    }
}

Даже с ограничением prefWidth из другого сообщения моя GridPane не будет расти! Независимо от того, какую комбинацию ограничений макета я использую, она выглядит следующим образом:

Пример просмотра

GridPane должен расширяться до полной ширины ListCell (я хочу добавить кнопку удаления в правом нижнем углу). Я схожу с ума, пожалуйста, помогите!

10.01.2015

Ответы:


1

С помощью CSS вы можете проверить, что GridPane фактически использует все доступное пространство в ячейке, а ваши элементы управления — нет:

public MyListCell(){
    ... 
    _myComponent.setStyle("-fx-border-color: black;");
}

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

Допустим, у вас есть один Label в первой ячейке и один Button во второй, которые должны быть выровнены по правому краю. Все, что вам нужно сделать, это создать новый ColumnConstraints для второго столбца сетки, настроить его на постоянный рост и выровнять содержимое по правому краю:

private final Label label = new Label();
private final Button button = new Button("Click");

public MyListCell(){
    _myComponent.add(label, 0, 0);
    ColumnConstraints c1 = new ColumnConstraints();

    _myComponent.add(button, 1, 0);
    ColumnConstraints c2 = new ColumnConstraints();
    c2.setHgrow(Priority.ALWAYS);
    GridPane.setHalignment(button, HPos.RIGHT);

    _myComponent.getColumnConstraints().addAll(c1,c2);
}

И у вас будет ваша пользовательская ячейка списка:

Пользовательская ячейка списка

10.01.2015
  • Большое спасибо! Вы сэкономили мне часы (или дни)! Вы знаете, как теперь удалить маржу (чтобы не было mpadding/margin? Сорри, я новичок в JavaFX :) 11.01.2015
  • Стиль по умолчанию для ячеек определен в modena.css: .list-cell { -fx-padding: 0.25em 0.583em 0.25em 0.583em; }. Поэтому вам просто нужно переопределить его, установив setStyle("-fx-padding: 0;"); в конструкторе ячеек. 11.01.2015
  • Новые материалы

    Введение в контекст React
    В этом посте мы поговорим о Context API, который был представлен в React 16, и о том, как вы можете их использовать. Что такое контекст? Глядя на определение из react docs , оно..

    Шлюз с лицензией OSS, совместимый с Apollo Federation v2, появится в WunderGraph
    Сегодня мы рады сообщить, что мы сотрудничаем с поддерживаемой YC Tailor Technologies, Inc. для внедрения Apollo Federation v2. Реализация будет лицензирована MIT (Engine) и Apache 2.0..

    Это оно
    Ну, я официально уволился с работы! На этой неделе я буду лихорадочно выполнять последние требования Думающего , чтобы я мог сосредоточиться на поиске работы. Что именно это значит?..

    7 полезных библиотек JavaScript, которые вы должны использовать в своем следующем проекте
    Усильте свою разработку JavaScript Есть поговорка «Не нужно изобретать велосипед». Библиотеки — лучший тому пример. Это поможет вам написать сложные и трудоемкие функции простым способом...

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

    C в C.R.U.D с использованием React-Redux
    Если вы использовали React, возможно, вы знакомы с головной болью, связанной с обратным потоком данных. Передача состояния реквизитам от родительских компонентов к дочерним компонентам может..

    5 обязательных элементов современного инструмента конвейера данных
    В цифровом мире предприятия используют конвейеры данных для перемещения, преобразования и хранения огромных объемов данных. Эти конвейеры составляют основу бизнес-аналитики и играют..