我创建了一个简单的javafx应用程序,它实现了TextField的屏蔽,但突然间我遇到了一个不熟悉的错误,下面是代码:
Main.java
package com.example;
import javafx.application.Application;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import jidefx.scene.control.field.MaskTextField;
public class Main extends Application {
@Override
public void start(Stage stage) {
MaskTextField field = new MaskTextField();
VBox root = new VBox(20);
root.setAlignment(Pos.CENTER);
root.getChildren().addAll(field);
Scene scene = new Scene(root, 500, 500);
stage.setScene(scene);
stage.show();
}
}
MaskTextField.java
package com.example;
import java.util.ArrayList;
import javafx.scene.control.TextField;
public class MaskTextField extends TextField {
private String mask;
private ArrayList<String> patterns;
public MaskTextField() {
super();
patterns = new ArrayList<String>();
}
public MaskTextField(String text) {
super(text);
patterns = new ArrayList<String>();
}
@Override
public void replaceText(int start, int end, String text) {
String tempText = this.getText() + text;
if(mask == null || mask.length() == 0){
super.replaceText(start, end, text);
}else if (tempText.matches(this.mask) || tempText.length() == 0) { //text.length == 0 representa o delete ou backspace
super.replaceText(start, end, text);
} else {
String tempP = "^";
for (String patt : this.patterns) {
tempP += patt;
if (tempText.matches(tempP)) {
super.replaceText(start, end, text);
break;
}
}
}
}
/**
* @return the Regex Mask
*/
public String getMask() {
return mask;
}
/**
* @param mask the mask to set
*/
public void setMask(String mask) {
String tempMask = "^";
for (int i = 0; i < mask.length(); ++i) {
char temp = mask.charAt(i);
String regex;
int counter = 1;
int step = 0;
if (i < mask.length() - 1) {
for (int j = i + 1; j < mask.length(); ++j) {
if (temp == mask.charAt(j)) {
++counter;
step = j;
} else if (mask.charAt(j) == '!') {
counter = -1;
step = j;
} else {
break;
}
}
}
switch (temp) {
case '*':
regex = ".";
break;
case 'S':
regex = "[^\\s]";
break;
case 'P':
regex = "[A-z.]";
break;
case 'M':
regex = "[0-z.]";
break;
case 'A':
regex = "[0-z]";
break;
case 'N':
regex = "[0-9]";
break;
case 'L':
regex = "[A-z]";
break;
case 'U':
regex = "[A-Z]";
break;
case 'l':
regex = "[a-z]";
break;
case '.':
regex = "\\.";
break;
default:
regex = Character.toString(temp);
break;
}
if (counter != 1) {
this.patterns.add(regex);
if (counter == -1) {
regex += "+";
this.patterns.add(regex);
} else {
String tempRegex = regex;
for (int k = 1; k < counter; ++k) {
regex += tempRegex;
this.patterns.add(tempRegex);
}
}
i = step;
} else {
this.patterns.add(regex);
}
tempMask += regex;
}
this.mask = tempMask + "$";
}
}
执行上述代码后,应用程序将抛出错误:
Caused by: java.lang.NoSuchMethodError: java.lang.invoke.LambdaMetafactory.metaFactory(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;
at java.lang.invoke.MethodHandleNatives.resolve(Native Method)
at java.lang.invoke.MemberName$Factory.resolve(MemberName.java:962)
at java.lang.invoke.MemberName$Factory.resolveOrFail(MemberName.java:987)
at java.lang.invoke.MethodHandles$Lookup.resolveOrFail(MethodHandles.java:1390)
at java.lang.invoke.MethodHandles$Lookup.linkMethodHandleConstant(MethodHandles.java:1746)
at java.lang.invoke.MethodHandleNatives.linkMethodHandleConstant(MethodHandleNatives.java:477)
... 13 more
Java Result: 1
如何修复此问题?