< prev index next >

modules/javafx.controls/src/main/java/javafx/scene/control/Cell.java

Print this page
rev 10463 : 8089514: [TableView, TreeView, ListView, TreeTableView] Clicking outside of the edited cell, node, or entry should commit the value

*** 40,49 **** --- 40,51 ---- import javafx.beans.property.ReadOnlyBooleanProperty; import javafx.beans.property.ReadOnlyBooleanWrapper; import javafx.beans.value.WritableValue; import javafx.css.StyleableProperty; + import java.util.Optional; + /** * The Cell API is used for virtualized controls such as {@link ListView}, * {@link TreeView}, and {@link TableView}. * A Cell is a {@link Labeled} {@link Control}, and is used to render a single * "row" inside a ListView, TreeView or TableView. Cells are also used for each
*** 357,374 **** /** * Indicates whether or not this cell has focus. For example, a * ListView defines zero or one cell as being the "focused" cell. This cell * would have focused set to true. */ ! super.focusedProperty().addListener(new InvalidationListener() { ! @Override public void invalidated(Observable property) { ! pseudoClassStateChanged(PSEUDO_CLASS_FOCUSED, isFocused()); // TODO is this necessary?? ! // The user has shifted focus, so we should cancel the editing on this cell if (!isFocused() && isEditing()) { ! cancelEdit(); ! } } }); // initialize default pseudo-class state pseudoClassStateChanged(PSEUDO_CLASS_EMPTY, true); --- 359,372 ---- /** * Indicates whether or not this cell has focus. For example, a * ListView defines zero or one cell as being the "focused" cell. This cell * would have focused set to true. */ ! super.focusedProperty().addListener(o -> { // The user has shifted focus, so we should cancel the editing on this cell if (!isFocused() && isEditing()) { ! attemptEditCommit(); } }); // initialize default pseudo-class state pseudoClassStateChanged(PSEUDO_CLASS_EMPTY, true);
*** 628,637 **** --- 626,636 ---- @Override protected void layoutChildren() { if (itemDirty) { updateItem(getItem(), isEmpty()); itemDirty = false; } + super.layoutChildren(); }
*** 734,743 **** --- 733,762 ---- */ protected boolean isItemChanged(T oldItem, T newItem) { return oldItem != null ? !oldItem.equals(newItem) : newItem != null; } + /** + * Developers of custom cell implementations should override this method when + * the cell provides editing functionality, with this method returning the + * user input after the user has interacted with the editing components. + * The form of the returned data (wrapped in an {@link Optional}) should + * be the same as the form of the underlying data model, hence the + * use of the {@code T} generic type. If no value is available, or if the + * value to be returned is invalid, {@code Optional.empty()} should be returned + * to indicate that the commit should not proceed.. + * + * @return The value provided by the user into this cell when it was in its + * editing state, in the form of the underlying data model. If the value + * is invalid or unable to be determined, {@code Optional.empty()} should + * be returned. + * @since 10 + */ + protected Optional<T> getEditorValue() { + return Optional.empty(); + } + /*************************************************************************** * * * Private Implementation *
*** 751,772 **** private final void markCellDirty() { itemDirty = true; requestLayout(); } /*************************************************************************** * * * Stylesheet Handling * * * **************************************************************************/ private static final String DEFAULT_STYLE_CLASS = "cell"; private static final PseudoClass PSEUDO_CLASS_SELECTED = PseudoClass.getPseudoClass("selected"); - private static final PseudoClass PSEUDO_CLASS_FOCUSED = - PseudoClass.getPseudoClass("focused"); private static final PseudoClass PSEUDO_CLASS_EMPTY = PseudoClass.getPseudoClass("empty"); private static final PseudoClass PSEUDO_CLASS_FILLED = PseudoClass.getPseudoClass("filled"); --- 770,794 ---- private final void markCellDirty() { itemDirty = true; requestLayout(); } + void attemptEditCommit() { + // The user has shifted focus, so we should cancel the editing on this cell + getEditorValue().ifPresentOrElse(this::commitEdit, this::cancelEdit); + } + /*************************************************************************** * * * Stylesheet Handling * * * **************************************************************************/ private static final String DEFAULT_STYLE_CLASS = "cell"; private static final PseudoClass PSEUDO_CLASS_SELECTED = PseudoClass.getPseudoClass("selected"); private static final PseudoClass PSEUDO_CLASS_EMPTY = PseudoClass.getPseudoClass("empty"); private static final PseudoClass PSEUDO_CLASS_FILLED = PseudoClass.getPseudoClass("filled");
< prev index next >