如何将我的自定义 class 正确导入此 FXML 文件?
How do I import my custom class correctly into this FXML file?
我正在制作一个简单的食谱应用程序来练习 JavaFX,但我 运行 遇到了问题。我似乎无法导入这个 class:
package application;
import javafx.beans.property.SimpleStringProperty;
public class Recipe {
private final SimpleStringProperty Name = new SimpleStringProperty("");
public Recipe() {
this("");
}
public Recipe(String recipeName) {
setRecipeName(recipeName);
}
public String getRecipeName() {
return Name.get();
}
public void setRecipeName(String rName) {
Name.set(rName);
}
}
进入此 FXML 视图文件:
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.TableColumn?>
<?import javafx.scene.control.TableView?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.control.cell.*?>
<?import javafx.collections.*?>
<?import fxmltableview.*?>
<?import java.lang.String?>
<?import application.Recipe ?>
<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8.0.111" xmlns:fx="http://javafx.com/fxml/1">
<children>
<TableView prefHeight="400.0" prefWidth="600.0">
<columns>
<TableColumn prefWidth="599.0" text="Column One" >
<cellValueFactory><PropertyValueFactory property="Name" />
</cellValueFactory>
</TableColumn>
</columns>
<items>
<FXCollections fx:factory="observableArrayList">
<Recipe Name="Test Name"/>
</FXCollections>
</items>
</TableView>
</children>
</AnchorPane>
我一直收到在线错误。非常感谢任何帮助。
好吧,事实证明我无法命名字段 "Name",因为它显然指的是 FXCollections 中的某些内容(我认为),所以我将我的 属性 更改为 recipeName 并且似乎解决了问题。
属性 Java 中的名称由方法名称决定,而不是字段名称。由于您的 Recipe
class 定义了方法 getRecipeName()
和 setRecipeName(...)
,因此 属性 名称为 recipeName
。因此你需要
<Recipe recipeName="Test Name"/>
您可以随意命名字段 - 它不会影响 属性 名称的含义。但是,最好遵循 standard naming conventions 并使字段名称以小写开头。在 JavaFX 中定义 属性 访问器方法也很有用。这是一个例子:
public class Recipe {
private final SimpleStringProperty name = new SimpleStringProperty("");
public Recipe() {
this("");
}
public Recipe(String recipeName) {
setRecipeName(recipeName);
}
public String getRecipeName() {
return name.get();
}
public void setRecipeName(String rName) {
name.set(rName);
}
public StringProperty recipeNameProperty() {
return name ;
}
}
我正在制作一个简单的食谱应用程序来练习 JavaFX,但我 运行 遇到了问题。我似乎无法导入这个 class:
package application;
import javafx.beans.property.SimpleStringProperty;
public class Recipe {
private final SimpleStringProperty Name = new SimpleStringProperty("");
public Recipe() {
this("");
}
public Recipe(String recipeName) {
setRecipeName(recipeName);
}
public String getRecipeName() {
return Name.get();
}
public void setRecipeName(String rName) {
Name.set(rName);
}
}
进入此 FXML 视图文件:
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.TableColumn?>
<?import javafx.scene.control.TableView?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.control.cell.*?>
<?import javafx.collections.*?>
<?import fxmltableview.*?>
<?import java.lang.String?>
<?import application.Recipe ?>
<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8.0.111" xmlns:fx="http://javafx.com/fxml/1">
<children>
<TableView prefHeight="400.0" prefWidth="600.0">
<columns>
<TableColumn prefWidth="599.0" text="Column One" >
<cellValueFactory><PropertyValueFactory property="Name" />
</cellValueFactory>
</TableColumn>
</columns>
<items>
<FXCollections fx:factory="observableArrayList">
<Recipe Name="Test Name"/>
</FXCollections>
</items>
</TableView>
</children>
</AnchorPane>
我一直收到在线错误。非常感谢任何帮助。
好吧,事实证明我无法命名字段 "Name",因为它显然指的是 FXCollections 中的某些内容(我认为),所以我将我的 属性 更改为 recipeName 并且似乎解决了问题。
属性 Java 中的名称由方法名称决定,而不是字段名称。由于您的 Recipe
class 定义了方法 getRecipeName()
和 setRecipeName(...)
,因此 属性 名称为 recipeName
。因此你需要
<Recipe recipeName="Test Name"/>
您可以随意命名字段 - 它不会影响 属性 名称的含义。但是,最好遵循 standard naming conventions 并使字段名称以小写开头。在 JavaFX 中定义 属性 访问器方法也很有用。这是一个例子:
public class Recipe {
private final SimpleStringProperty name = new SimpleStringProperty("");
public Recipe() {
this("");
}
public Recipe(String recipeName) {
setRecipeName(recipeName);
}
public String getRecipeName() {
return name.get();
}
public void setRecipeName(String rName) {
name.set(rName);
}
public StringProperty recipeNameProperty() {
return name ;
}
}