链接到完整项目.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;
}
}
答案 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()
相同的值:使get
和set
方法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)
等等。)