Java Fx TreeTableView различные элементы контекстного меню

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

Предположим, что у меня есть таблица со структурой вроде:


посетители


посетитель 1

посетитель 2

посетитель 3

болтовня


болтовня1

болтовня2


Здесь, в этой таблице, мы можем метафорически сказать, что у нас есть два корневых узла: «Посетители» и «Чатеры». Теперь я хочу иметь два контекстных меню с разными параметрами. Контекстное меню для посетителей, которое, как мы можем сказать, имеет один пункт «Пригласить в чат» и другое контекстное меню, которое обрабатывает болтовню и имеет различные параметры, такие как: «кикнуть», «запретить» и так далее. Моя проблема в том, как я могу достичь этого сценария? Где я должен использовать эти контекстные меню? Должен ли я использовать их с ячейками, строками или таблицей?


person Khafaga    schedule 15.12.2014    source источник
comment
что не так с фабрикой пользовательских ячеек?   -  person kleopatra    schedule 15.12.2014
comment
@kleopatra: и как я могу использовать клеточную фабрику для достижения этого?   -  person Khafaga    schedule 15.12.2014
comment
ааа .. при повторном чтении я вижу, что вы хотите, чтобы содержимое зависело от выбранных данных. но тогда я не понимаю проблемы: обновляйте contextMenu при каждом изменении выбора, т.е. Итак, в чем же собственно ваша проблема? Лучше всего показать SSCCE, который демонстрирует, чего вы хотите достичь, и почему это не работает должным образом.   -  person kleopatra    schedule 15.12.2014
comment
@kleopatra: я обновил свой вопрос. Так понятно?   -  person Khafaga    schedule 15.12.2014
comment
Ваше описание неясно: хотите отдельное контекстное меню для каждого типа данных? Тогда смотрите мой первый комментарий. Хотите отдельное контекстное меню для выбранных строк? Смотрите мой второй комментарий. Во всяком случае, SSCCE все еще отсутствует ...   -  person kleopatra    schedule 15.12.2014


Ответы (1)


Используйте собственную фабрику строк и настройте контекстное меню в методе updateItem(...).

Предполагая, что у вас есть

TreeTableView<MyDataType> treeTable = ... ;

вы бы сделали что-то вроде

treeTable.setRowFactory(ttv -> {
    ContextMenu contextMenu = new ContextMenu();
    MenuItem inviteMenuItem = new MenuItem("Invite to Chat");
    // ...
    MenuItem banMenuItem = new MenuItem("Ban");
    // ...
    TreeTableRow<MyDataType> row = new TreeTableRow<MyDataType>() {
        @Override
        public void updateItem(MyDataType item, boolean empty) {
            super.updateItem(item, empty);
            if (empty) {
                setContextMenu(null);
            } else {
                // configure context menu with appropriate menu items, 
                // depending on value of item
                setContextMenu(contextMenu);
            }
        }
    };
    inviteMenuItem.setOnAction(evt -> {
        MyDataType item = row.getItem();
        // do something with item...
    });
    // event handlers for other menu items...
    return row ;
});

Предупреждение: это не проверено, поскольку вы не предоставили мне MCVE для тестирования, но это должно дать вам общее представление . Это покажет соответствующее контекстное меню для строки, которую щелкает пользователь (с соответствующим триггером для контекстного меню, например, щелчком правой кнопкой мыши); это не зависит от того, какой элемент выбран.

person James_D    schedule 15.12.2014
comment
Могу ли я иметь более одной фабрики строк для одной и той же таблицы? - person Khafaga; 16.12.2014
comment
Нет. Фабрика строк — это объект, который таблица использует для создания строк таблицы. Если бы их было больше одного, как бы он узнал, какой из них использовать? - person James_D; 16.12.2014
comment
Большое спасибо, теперь это имеет смысл после редактирования, и это именно то, что я ищу. - person Khafaga; 16.12.2014