我通过扩展现有控件创建了一个新控件,我想在我的JavaFX场景中使用这个新控件.我希望能够使用Scene Builder编辑我的场景,但在将新控件添加到FXML文件后,我ClassNotFoundException
在打开Scene Builder 时遇到了问题.
例如,这是我制作的一个类,它扩展了TextField
:
RegexLimitingTextField.java
public class RegexLimitingTextField extends TextField { private String regexLimiter = ".*"; public void setRegexLimiter(String regex) { this.regexLimiter = regex; } @Override public void replaceText(int start, int end, String text) { if (text.matches(regexLimiter)) super.replaceText(start, end, text); } @Override public void replaceSelection(String replacement) { if (replacement.matches(regexLimiter)) super.replaceSelection(replacement); } }
将此控件添加到我的FXML文件后...
sample.fxml
...加载Scene Builder 2.0时出现此错误:
Caused by: java.lang.ClassNotFoundException: sample.RegexLimitingTextField at java.lang.ClassLoader.findClass(ClassLoader.java:530) at java.lang.ClassLoader.loadClass(ClassLoader.java:424) at java.lang.ClassLoader.loadClass(ClassLoader.java:357) at javafx.fxml.FXMLLoader.loadTypeForPackage(FXMLLoader.java:2920) at javafx.fxml.FXMLLoader.loadType(FXMLLoader.java:2909) at javafx.fxml.FXMLLoader.importClass(FXMLLoader.java:2850) ... 23 more
为什么Scene Builder找不到我的新控件?我需要做什么才能找到并能够使用我的新控件?
如果需要,以下是其他文件:
Main.java
public class Main extends Application { public static void main(String[] args) { launch(args); } @Override public void start(Stage primaryStage) throws Exception { Parent root = FXMLLoader.load(getClass().getResource("sample.fxml")); primaryStage.setScene(new Scene(root, 200, 200)); primaryStage.show(); } }
Controller.java
public class Controller implements Initializable { public RegexLimitingTextField textField; @Override public void initialize(URL url, ResourceBundle resourceBundle) { textField.setRegexLimiter("\\w*"); } }
Brad Turek.. 6
如果仍然有人对SceneBuilder无法加载其自定义组件感到烦恼,只需传递ClassLoader即可为我解决问题。
try { FXMLLoader loader = new FXMLLoader(getClass().getResource("CustomComponent.fxml")); loader.setRoot(this); loader.setController(this); loader.setClassLoader(getClass().getClassLoader()); loader.load(); } catch (IOException e ){ throw new RuntimeException(e); }
功劳归奇迹的工作者thatjavaguy。
如果仍然有人对SceneBuilder无法加载其自定义组件感到烦恼,只需传递ClassLoader即可为我解决问题。
try { FXMLLoader loader = new FXMLLoader(getClass().getResource("CustomComponent.fxml")); loader.setRoot(this); loader.setController(this); loader.setClassLoader(getClass().getClassLoader()); loader.load(); } catch (IOException e ){ throw new RuntimeException(e); }
功劳归奇迹的工作者thatjavaguy。