Доброго дня! Есть ли способ в jmix в компонентах DataGrid и Table скопировать в буфер обмена значение из выделенной ячейки, не сущность целиком, а именно данные из той ячейки, которая выделенная. В руководстве пока нашел только ClipboardTrigger, но если делать через него, программно это не работает. Мои действия: получаю объект с помощью DataGrid.ItemClickEvent методом event.getItem(), получаю id столбца: event.getColumnId(), получаю класс объекта item.getClass(), с помощью id столбца генерирую метод get: aClass.getMethod(methodName) и выполняю его method.invoke(item), получаю имя составного объекта metadataTools.getInstanceName(result), и устанавливаю его в текстовое поле для ClipboardTrigger copyField.setValue(name). В ClipboardTrigger соответственно указаны кнопка и поле: copyBtn, copyField. В таблице создаю действие и в эвенте onDocumentsTableCopy(Action.ActionPerformedEvent event) выполняю copyBtn.click(), но ничего не происходит, хотя если нажать на кнопку в экране, происходит копирование. К тому же данный подход на мой взгляд имеет множество недостатков, есть ли способ сделать это проще?
У DataGrid
и Table
и того, что на их основе - есть свойство textSelectionEnabled
.
Оно отвечает за возможность выделения текста в ячейке.
После выделения стандартное Ctrl+C копирует выделенное в буфер.
Это не совсем то, что нужно, т.к. хотелось бы тоже поведение добавить в Action у таблицы. Есть ли еще варианты?
Можно использовать JavaScript
JavaScript.getCurrent().execute(
"navigator.clipboard.writeText('${
<your data>
}');"
)
При этом тк Текст копируется при помощи js
navigator.clipboard.writeText
. Требуется чтоб ваш сайт был безопасным источником — либо HTTPS
, либо локальный хост
Благодарю за ответ, все же больше интересует как это сделать средствами java и jmix.
Я использовал JavaScript по аналогии с примером выше:
import com.vaadin.server.Page;
@Subscribe("documentsTable.copy")
public void onDocumentsTableCopy(Action.ActionPerformedEvent event) {
...
String txt= metadataTools.getInstanceName(result);
Page.getCurrent().getJavaScript().execute("navigator.clipboard.writeText(\"" + txt + "\");");
}