У меня есть компонент в панели, с DragSourceExtension
я могу передавать любые данные по DragData
, но не могу получить относительные X и Y с DragStartEvent
.
- Я могу получить относительные X и Y конечной позиции с помощью
DropEvent
.
В vaadin 7 с DragAndDropWrapper.WrapperTransferable
(переносимым) мы можем получить относительные X и Y при начале перетаскивания:
transferable.getMouseDownEvent().getClientX()
transferable.getMouseDownEvent().getClientY()
ОБНОВЛЕНИЕ: это часть кода:
DropTargetExtension<AbsoluteLayout> absoluteLayoutDropTargetExtension = new DropTargetExtension<>(sceneLayout);
...
absoluteLayoutDropTargetExtension.addDropListener(event -> {
Optional<Object> source = event.getDragData();
int x = event.getMouseEventDetails().getRelativeX();
int y = event.getMouseEventDetails().getRelativeY();
с x и y - текущая позиция мыши, но у меня нет начальной позиции для расчета разницы
ОБНОВЛЕНИЕ 2: в этом документе компонент и расширение пользовательского интерфейса я тестирую расширение пример.
public class CapsLockWarning extends AbstractExtension {
// You could pass it in the constructor
public CapsLockWarning(PasswordField field) {
super.extend(field);
System.out.println("CapsLockWarning");
}
// Or in an extend() method
public void extend(PasswordField field) {
super.extend(field);
}
// Or with a static helper
public static void addTo(PasswordField field) {
new CapsLockWarning(field);
}
}
@Connect(CapsLockWarning.class)
public class CapsLockWarningConnector extends AbstractExtensionConnector {
public CapsLockWarningConnector() {
super();
System.out.println("CapsLockWarningConnector");
}
@Override
protected void extend(ServerConnector target) {
// Get the extended widget
final Widget pw = ((ComponentConnector) target).getWidget();
// Preparations for the added feature
final VOverlay warning = new VOverlay();
warning.setOwner(pw);
warning.add(new HTML("Caps Lock is enabled!"));
Window.alert("ssss");
// Add an event handler
pw.addDomHandler(new KeyPressHandler() {
public void onKeyPress(KeyPressEvent event) {
if (isEnabled() && isCapsLockOn(event)) {
warning.showRelativeTo(pw);
UiUtilities.showMessage("oh");
} else {
warning.hide();
}
}
}, KeyPressEvent.getType());
}
private boolean isCapsLockOn(KeyPressEvent e) {
return e.isShiftKeyDown() ^
Character.isUpperCase(e.getCharCode());
}
}
UI:
txtPassword = new PasswordField(bundle.getString("common.password"));
txtPassword.setRequiredIndicatorVisible(true);
binder.forField(txtPassword).asRequired(MessageFormat.format(bundle.getString("common.error.isRequiredFor"), bundle.getString("common.password")))
.bind(HostEntity::getPassword, HostEntity::setPassword);
txtPassword.addStyleName("inline-label");
new CapsLockWarning(txtPassword);
form.addComponent(txtPassword);
но конструктор CapsLockWarningConnector
не запустился, и в пользовательском интерфейсе не произошло никаких действий.