Javafx:不兼容的类型:int无法转换为IntegerProperty

时间:2018-01-24 19:17:43

标签: java javafx

链接到完整项目.zip(大学库存系统)https://www.dropbox.com/s/t88vsjt7awmlv93/MattNapper.zip?dl=0

尝试使用ObservableList获取要在tableview中显示的数据。零件模型是一个抽象。 InHousePart和OutsoucredPart扩展Part。库存是我声明ObservableList,伪数据,返回ObservableList方法

的地方

在我的库存课程中,我有:

public class Inventory {
    //declaring arrays for parts, and products
    private ObservableList<Product> products = FXCollections.observableArrayList();
    private ObservableList<Part> allParts = FXCollections.observableArrayList();



    //fake data
    //**This is where the error incompatible types: int cant be converted to Integer Property**
    InHousePart part1 = new InHousePart (1, 1, "pick", 10.00, 1, 1, 5 );

    //adds fake data to "allParts" arraylist
    public void addData() {
        allParts.add(part1);
    }

    public ObservableList<Part> getPartData() {
        return allParts;
    }

InHousePart Class

public class InHousePart extends Part{

    //constructors

    private IntegerProperty machineID;

    public IntegerProperty getMachineID() {
        return machineID;
    }

    public void setMachineID(IntegerProperty machineID) {
        this.machineID = machineID;
    }

    //constructor
    public InHousePart(IntegerProperty machineID, IntegerProperty partID, StringProperty name, DoubleProperty price, IntegerProperty inStock, IntegerProperty min, IntegerProperty max) {
        super(partID, name, price, inStock, min, max);
        this.machineID = machineID;
    }

Part Class

public abstract class Part  {

    private IntegerProperty partID;
    private StringProperty name;
    private DoubleProperty price;
    private IntegerProperty inStock;
    private IntegerProperty min;
    private IntegerProperty max;

    public IntegerProperty getPartID() {
        return partID;
    }

    public void setPartID(IntegerProperty partID) {
        this.partID = partID;
    }

    public StringProperty getName() {
        return name;
    }

    public void setName(StringProperty name) {
        this.name = name;
    }

    public DoubleProperty getPrice() {
        return price;
    }

    public void setPrice(DoubleProperty price) {
        this.price = price;
    }

    public IntegerProperty getInStock() {
        return inStock;
    }

    public void setInStock(IntegerProperty inStock) {
        this.inStock = inStock;
    }

    public IntegerProperty getMin() {
        return min;
    }

    public void setMin(IntegerProperty min) {
        this.min = min;
    }

    public IntegerProperty getMax() {
        return max;
    }

    public void setMax(IntegerProperty max) {
        this.max = max;
    }

    //constructor
    public Part(IntegerProperty partID, StringProperty name, DoubleProperty price, IntegerProperty inStock, IntegerProperty min, IntegerProperty max) {
        this.partID = partID;
        this.name = name;
        this.price = price;
        this.inStock = inStock;
        this.min = min;
        this.max = max;
    }   
}

1 个答案:

答案 0 :(得分:1)

如果要使用JavaFX属性,则应遵循tutorial中描述的模式。基本上,IntegerProperty实现的属性就其定义的get / set方法而言应该看起来就像JavaBean int属性。因此,您的Part类应包含以下API:

public int getPartID() ;
public void setPartID(int partID);

由于您正在使用可观察属性来实现这两种方法,因此您应该使用方法

提供对该属性对象以及的访问权限。
public IntegerProperty partIDProperty();

一般模式是,对于名称为prop且名称为T的属性,您应该有方法

public T getProp() ;
public void setProp(T prop) ;
public ObjectProperty<T> propProperty();

(当T是基本类型时,最后一个方法的返回类型会略有不同)。

另请参阅When to use JavaFX properties setter and getter, instead of using the property directly进行类似的讨论。

所以你应该

public class Part {

    private final IntegerProperty partID = new SimpleIntegerProperty() ;

    public IntegerProperty partIDProperty() {
        return partID ;
    }

    public final int getPartID() {
        return partIDProperty().get();
    }

    public final void setPartID(int partID) {
        partIDProperty().set(partID);
    }

    // similarly for all other properties

}

这里有一个基本合同,getPartID()应该返回与partIDProperty().get()相同的值:使getset方法final确保这是真的即使该类是子类。

最后,构造函数应该为获取参数,而不是属性。所以你的构造函数应该是

public Part(int partID, String name, double price, int inStock, int min, int max) {
    setPartID(partID);
    setName(name);
    setPrice(price);
    setInStock(inStock);
    setMin(min);
    setMax(max);
}   

请注意,从构造函数中调用这些set方法是安全的,因为它们是final。 (如果你愿意的话,你也可以partIDProperty.set(partID)等等。)