-1

link to full project .zip (Inventory System for College) https://www.dropbox.com/s/t88vsjt7awmlv93/MattNapper.zip?dl=0

Trying to get data to show in tableview using ObservableList. Part Model is an abstract. InHousePart, and OutsoucredPart extend Part. Inventory is where I declare ObservableList, fake data, return ObservableList method

In my Inventory class I have:

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;
    }   
}
Juan Carlos Mendoza
  • 5,736
  • 7
  • 25
  • 50
matt napper
  • 75
  • 10

1 Answers1

2

If you want to use JavaFX properties, you should follow the pattern described in the tutorial. Basically, a property implemented by an IntegerProperty should look just like a JavaBean int property in terms of the get/set methods it defines. So your Part class should include the following API:

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

Since you're using an observable property to implement these two methods, you should provide access to that property object as well, using the method

public IntegerProperty partIDProperty();

The general pattern is, that for a property with name, say, prop, of type T, you should have methods

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

(when T is a primitive type, the return type of the last method will be slightly different).

Also see When to use JavaFX properties setter and getter, instead of using the property directly for a similar discussion.

So you should have

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

}

There is a basic contract here that getPartID() should return the same value as partIDProperty().get(): making the get and set methods final ensures this is true even if the class is subclassed.

Finally, the constructor should take parameters for the values, not for the properties. So your constructor should be

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);
}   

Note that it is safe to call those set methods from the constructor, because they are final. (You could also just do partIDProperty.set(partID), etc., if you wanted.)

James_D
  • 201,275
  • 16
  • 291
  • 322