Эх сурвалжийг харах

:bug: Fix for issue #69
MFXPasswordField context menu could not be styled because the defaultContextMenu() was empty. Like said in documentation this was done because the context menu for the password field is created in the skin since many functions are specified by the skin. This caused a NullPointerException if calling getMFXContextMenu() before the control was laid out.
To workaround this, the defaultContextMenu() now sets an empty context menu, so the getter doesn't return null, and the items are added in the skin

palexdev 4 жил өмнө
parent
commit
0066d66b26

+ 11 - 4
materialfx/src/main/java/io/github/palexdev/materialfx/controls/MFXContextMenu.java

@@ -358,10 +358,7 @@ public class MFXContextMenu extends VBox {
          * Adds a separator to the items list.
          */
         public Builder addSeparator() {
-            Line separator = new Line();
-            separator.getStyleClass().add("separator");
-            VBox.setMargin(separator, new Insets(4, 0, 3, 0));
-            items.add(separator);
+            items.add(getSeparator());
             return this;
         }
 
@@ -372,5 +369,15 @@ public class MFXContextMenu extends VBox {
             contextMenu.setItems(items);
             return contextMenu;
         }
+
+        /**
+         * Builds a separator.
+         */
+        public static Line getSeparator() {
+            Line separator = new Line();
+            separator.getStyleClass().add("separator");
+            VBox.setMargin(separator, new Insets(4, 0, 3, 0));
+            return separator;
+        }
     }
 }

+ 3 - 1
materialfx/src/main/java/io/github/palexdev/materialfx/controls/MFXPasswordField.java

@@ -122,7 +122,9 @@ public class MFXPasswordField extends MFXTextField {
      * simply calling JavaFX methods.
      */
     @Override
-    protected void defaultContextMenu() {}
+    protected void defaultContextMenu() {
+        setMFXContextMenu(MFXContextMenu.Builder.build(this).install());
+    }
 
     /**
      * @return the un-masked text

+ 9 - 10
materialfx/src/main/java/io/github/palexdev/materialfx/skins/MFXPasswordFieldSkin.java

@@ -27,6 +27,7 @@ import javafx.beans.property.SimpleStringProperty;
 import javafx.beans.property.StringProperty;
 import javafx.beans.value.ChangeListener;
 import javafx.beans.value.ObservableValue;
+import javafx.collections.FXCollections;
 import javafx.scene.control.IndexRange;
 import javafx.scene.input.Clipboard;
 import javafx.scene.input.KeyCode;
@@ -316,16 +317,14 @@ public class MFXPasswordFieldSkin extends MFXTextFieldSkin {
                 .setAccelerator("Ctrl + A")
                 .setAction(event -> passwordField.selectAll());
 
-        passwordField.setMFXContextMenu(
-                MFXContextMenu.Builder.build(passwordField)
-                        .addMenuItem(copy)
-                        .addMenuItem(cut)
-                        .addMenuItem(paste)
-                        .addMenuItem(delete)
-                        .addSeparator()
-                        .addMenuItem(selectAll)
-                        .install()
-        );
+        passwordField.getMFXContextMenu().setItems(FXCollections.observableArrayList(
+                copy,
+                cut,
+                paste,
+                delete,
+                MFXContextMenu.Builder.getSeparator(),
+                selectAll
+        ));
     }
 
     /**