2017-07-17 60 views
1

我正在製作一個簡單的食譜應用程序來練習JavaFX,我遇到了一個問題。我似乎無法導入這個類:如何正確導入我的自定義類到這個FXML文件中?

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> 

我一直就行收到一個錯誤。任何幫助是極大的讚賞。

+0

嗨, 我不知道,如果解決您的問題(我想不會,SRY),但命名您的變量「名稱」(首字母大寫)被認爲是不好風格,並可能被編譯器誤解。 (至少據我所知...) – GoatyGuy

+0

是的,這並沒有真正幫助我,但你是對的,我改變它爲recipeName,這是更明顯的,但...我仍然無法得到它工作。編輯:沒關係,這是命名約定。名稱顯然指的是...中的保留字段,我不知道,但現在起作用。 – JLH

回答

0

Java中的屬性名稱由方法名稱決定,而不是字段名稱。由於您的Recipe類定義了方法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 ; 
    } 

} 
0

好吧,事實證明我無法命名字段「名稱」,因爲它顯然是指FXCollections中的某些內容(我認爲),所以我將屬性更改爲recipeName,似乎解決了問題。

+0

一個會喜歡;) – GoatyGuy

+0

這根本不是問題。問題在於,類中的屬性名是'recipeName'(因爲你有'getRecipeName'和'setRecipeName')方法,但是在FXML中你試圖引用一個名爲'Name'的屬性(所以FXMLLoader會嘗試找到一個名爲'setName'的方法,它不存在)。 –

相關問題