Событие нажатия и удержания можно легко смоделировать в JavaFX, как в этом вопрос.
Как только вы получите начальное событие, все, что вам нужно сделать, это вызвать ContextMenu из TextField. Поскольку TextField.getContextMenu()
не вернет значение по умолчанию, вы можете указать свое собственное или попытаться получить значение по умолчанию.
Получить значение по умолчанию немного сложнее, так как оно является частью класса TextFieldBehavior
. Он содержит этот метод public void contextMenuRequested(ContextMenuEvent e);
, поэтому все, что вам нужно сделать, это предоставить ContextMenuEvent
и запустить событие из TextField.
Это быстрая реализация:
public class BasicView extends View {
public BasicView(String name) {
super(name);
TextField textField = new TextField();
addPressAndHoldHandler(textField, Duration.seconds(1), event -> {
Bounds bounds = textField.localToScreen(textField.getBoundsInLocal());
textField.fireEvent(new ContextMenuEvent(ContextMenuEvent.CONTEXT_MENU_REQUESTED,
0, 0, bounds.getMinX() + 10, bounds.getMaxY() + 10, false, null));
});
setCenter(new VBox(15.0, new Label("Push and hold for ContextMenu"), textField));
}
private void addPressAndHoldHandler(Node node, Duration holdTime, EventHandler<MouseEvent> handler) {
class Wrapper<T> {
T content;
}
Wrapper<MouseEvent> eventWrapper = new Wrapper<>();
PauseTransition holdTimer = new PauseTransition(holdTime);
holdTimer.setOnFinished(event -> handler.handle(eventWrapper.content));
node.addEventHandler(MouseEvent.MOUSE_PRESSED, event -> {
eventWrapper.content = event;
holdTimer.playFromStart();
});
node.addEventHandler(MouseEvent.MOUSE_RELEASED, event -> holdTimer.stop());
node.addEventHandler(MouseEvent.DRAG_DETECTED, event -> holdTimer.stop());
}
@Override
protected void updateAppBar(AppBar appBar) {
appBar.setTitleText("Push and Hold");
}
}
На рабочем столе это то, что вы получите:
Хорошей новостью является то, что вам не нужно изменять ContextMenu для Android, у JavaFX есть собственный:
Обратите внимание, что различные пункты меню будут меняться автоматически в зависимости от контекста, как во всплывающем окне на рабочем столе.
person
José Pereda
schedule
12.11.2016