0

Getting an error when trying to click the "Add" button in the Parts section of the mainwindow.fxml

Here's the error:

/Library/Java/JavaVirtualMachines/jdk1.8.0_251.jdk/Contents/Home/bin/java -javaagent:/Applications/IntelliJ IDEA.app/Contents/lib/idea_rt.jar=51593:/Applications/IntelliJ IDEA.app/Contents/bin -Dfile.encoding=UTF-8 -classpath /Library/Java/JavaVirtualMachines/jdk1.8.0_251.jdk/Contents/Home/jre/lib/charsets.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_251.jdk/Contents/Home/jre/lib/deploy.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_251.jdk/Contents/Home/jre/lib/ext/cldrdata.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_251.jdk/Contents/Home/jre/lib/ext/dnsns.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_251.jdk/Contents/Home/jre/lib/ext/jaccess.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_251.jdk/Contents/Home/jre/lib/ext/jfxrt.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_251.jdk/Contents/Home/jre/lib/ext/localedata.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_251.jdk/Contents/Home/jre/lib/ext/nashorn.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_251.jdk/Contents/Home/jre/lib/ext/sunec.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_251.jdk/Contents/Home/jre/lib/ext/sunjce_provider.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_251.jdk/Contents/Home/jre/lib/ext/sunpkcs11.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_251.jdk/Contents/Home/jre/lib/ext/zipfs.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_251.jdk/Contents/Home/jre/lib/javaws.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_251.jdk/Contents/Home/jre/lib/jce.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_251.jdk/Contents/Home/jre/lib/jfr.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_251.jdk/Contents/Home/jre/lib/jfxswt.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_251.jdk/Contents/Home/jre/lib/jsse.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_251.jdk/Contents/Home/jre/lib/management-agent.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_251.jdk/Contents/Home/jre/lib/plugin.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_251.jdk/Contents/Home/jre/lib/resources.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_251.jdk/Contents/Home/jre/lib/rt.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_251.jdk/Contents/Home/lib/ant-javafx.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_251.jdk/Contents/Home/lib/dt.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_251.jdk/Contents/Home/lib/javafx-mx.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_251.jdk/Contents/Home/lib/jconsole.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_251.jdk/Contents/Home/lib/packager.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_251.jdk/Contents/Home/lib/sa-jdi.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_251.jdk/Contents/Home/lib/tools.jar:/Users/wes/Dropbox/wes-WGU/software-i-c482/javafx/inventory-system-c482-wesley-oneal-2/out/production/InventorySystem-C482-wesley-oneal-2 wesleyoneal.inventoryapp.Main
Exception in thread "JavaFX Application Thread" java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
    at javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1774)
    at javafx.fxml.FXMLLoader$ControllerMethodEventHandler.handle(FXMLLoader.java:1657)
    at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86)
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
    at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
    at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:49)
    at javafx.event.Event.fireEvent(Event.java:198)
    at javafx.scene.Node.fireEvent(Node.java:8411)
    at javafx.scene.control.Button.fire(Button.java:185)
    at com.sun.javafx.scene.control.behavior.ButtonBehavior.mouseReleased(ButtonBehavior.java:182)
    at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(BehaviorSkinBase.java:96)
    at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(BehaviorSkinBase.java:89)
    at com.sun.javafx.event.CompositeEventHandler$NormalEventHandlerRecord.handleBubblingEvent(CompositeEventHandler.java:218)
    at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:80)
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
    at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
    at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54)
    at javafx.event.Event.fireEvent(Event.java:198)
    at javafx.scene.Scene$MouseHandler.process(Scene.java:3757)
    at javafx.scene.Scene$MouseHandler.access$1500(Scene.java:3485)
    at javafx.scene.Scene.impl_processMouseEvent(Scene.java:1762)
    at javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2494)
    at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:394)
    at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:295)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent$2(GlassViewEventHandler.java:432)
    at com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:410)
    at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:431)
    at com.sun.glass.ui.View.handleMouseEvent(View.java:555)
    at com.sun.glass.ui.View.notifyMouse(View.java:937)
Caused by: java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at sun.reflect.misc.Trampoline.invoke(MethodUtil.java:71)
    at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at sun.reflect.misc.MethodUtil.invoke(MethodUtil.java:275)
    at javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1769)
    ... 49 more
Caused by: javafx.fxml.LoadException: 
/Users/wes/Dropbox/wes-WGU/software-i-c482/javafx/inventory-system-c482-wesley-oneal-2/out/production/InventorySystem-C482-wesley-oneal-2/wesleyoneal/inventoryapp/addpart.fxml:18

    at javafx.fxml.FXMLLoader.constructLoadException(FXMLLoader.java:2601)
    at javafx.fxml.FXMLLoader.access$700(FXMLLoader.java:103)
    at javafx.fxml.FXMLLoader$ValueElement.processAttribute(FXMLLoader.java:932)
    at javafx.fxml.FXMLLoader$InstanceDeclarationElement.processAttribute(FXMLLoader.java:971)
    at javafx.fxml.FXMLLoader$Element.processStartElement(FXMLLoader.java:220)
    at javafx.fxml.FXMLLoader$ValueElement.processStartElement(FXMLLoader.java:744)
    at javafx.fxml.FXMLLoader.processStartElement(FXMLLoader.java:2707)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2527)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2441)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3214)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3175)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3148)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3124)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3104)
    at javafx.fxml.FXMLLoader.load(FXMLLoader.java:3097)
    at wesleyoneal.inventoryapp.mainController.addPartWindow(mainController.java:59)
    ... 59 more
Caused by: java.lang.InstantiationException: wesleyoneal.inventoryapp.Part
    at java.lang.Class.newInstance(Class.java:427)
    at sun.reflect.misc.ReflectUtil.newInstance(ReflectUtil.java:51)
    at javafx.fxml.FXMLLoader$ValueElement.processAttribute(FXMLLoader.java:927)
    ... 72 more
Caused by: java.lang.NoSuchMethodException: wesleyoneal.inventoryapp.Part.<init>()
    at java.lang.Class.getConstructor0(Class.java:3082)
    at java.lang.Class.newInstance(Class.java:412)
    ... 74 more

Process finished with exit code 0

I've looked at line 18 in the addpart.fxml where it says it's having issues, but everything there looks correct from what I can tell

Main.java:

package wesleyoneal.inventoryapp;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;

public class Main extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception {
        Parent root = FXMLLoader.load(getClass().getResource("mainwindow.fxml"));
        primaryStage.setScene(new Scene(root, 1180, 472));
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

mainController:

package wesleyoneal.inventoryapp;

import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.fxml.Initializable;
import javafx.scene.Node;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.stage.Stage;

import java.io.IOException;
import java.net.URL;
import java.util.ResourceBundle;

public class mainController implements Initializable {

    @FXML
    private TableView<Part> partsTable;
    @FXML
    private TableColumn<Part, Integer> partIdColumn;
    @FXML
    private TableColumn<Part, String> partNameColumn;
    @FXML
    private TableColumn<Part, Integer> partInvLevel;
    @FXML
    private TableColumn<Part, Double> partPriceCostColumn;

    @Override
    public void initialize(URL location, ResourceBundle resources) {
        partIdColumn.setCellValueFactory(new PropertyValueFactory<>("id"));
        partNameColumn.setCellValueFactory(new PropertyValueFactory<>("name"));
        partInvLevel.setCellValueFactory(new PropertyValueFactory<>("stock"));
        partPriceCostColumn.setCellValueFactory(new PropertyValueFactory<>("price"));

        partsTable.setItems(getParts());
    }

    public ObservableList<Part> getParts() {
        ObservableList<Part> partsList = FXCollections.observableArrayList();
        partsList.add(new InHousePart(1, "Part A", 1.99, 11, 1, 21, 1111));
        partsList.add(new InHousePart(2, "Part B", 2.99, 12, 2, 22, 2222));
        partsList.add(new OutsourcedPart(3, "Part C", 3.99, 13, 3, 33,
                "Wes' Company"));
        partsList.add(new OutsourcedPart(4, "Part D", 4.99, 14, 4, 44,
                "Wes' Company"));

        return partsList;

    }

    @FXML
    private void addPartWindow(ActionEvent event) throws IOException {
        Parent addPartParent = FXMLLoader.load(getClass().getResource("addpart.fxml"));
        Scene addPartScene = new Scene(addPartParent);
        Stage addPartStage = (Stage) ((Node) event.getSource()).getScene().getWindow();
        addPartStage.setScene(addPartScene);
        addPartStage.show();
    }
}

mainwindow.fxml:

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.ButtonBar?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.TableColumn?>
<?import javafx.scene.control.TableView?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.ColumnConstraints?>
<?import javafx.scene.layout.GridPane?>
<?import javafx.scene.layout.RowConstraints?>
<?import javafx.scene.shape.Rectangle?>
<?import javafx.scene.text.Font?>
<?import javafx.scene.text.Text?>

<GridPane fx:id="mainGridPane" alignment="center" hgap="10" style="-fx-background-color: lightgrey;" vgap="10.0" xmlns="http://javafx.com/javafx/8.0.171" xmlns:fx="http://javafx.com/fxml/1" fx:controller="wesleyoneal.inventoryapp.mainController">
    <columnConstraints>
        <ColumnConstraints />
        <ColumnConstraints maxWidth="600.0" minWidth="560.0" prefWidth="600.0" />
        <ColumnConstraints maxWidth="0.0" minWidth="0.0" prefWidth="0.0" />
    </columnConstraints>
    <rowConstraints>
        <RowConstraints />
        <RowConstraints />
        <RowConstraints />
        <RowConstraints />
        <RowConstraints />
        <RowConstraints />
        <RowConstraints maxHeight="0.0" minHeight="0.0" prefHeight="0.0" />
        <RowConstraints maxHeight="0.0" minHeight="0.0" prefHeight="0.0" />
    </rowConstraints>
    <children>
        <Label text="Inventory Management System" textFill="#494980">
            <font>
                <Font name="Helvetica Bold" size="16.0" />
            </font>
            <GridPane.margin>
                <Insets bottom="30.0" left="40.0" top="30.0" />
            </GridPane.margin>
        </Label>
        <Rectangle arcHeight="15.0" arcWidth="15.0" fill="#1f93ff00" height="260.0" stroke="#949494" strokeType="INSIDE" width="520.0" GridPane.rowIndex="1" GridPane.rowSpan="3">
            <GridPane.margin>
                <Insets left="40.0" />
            </GridPane.margin>
        </Rectangle>
        <TableView fx:id="partsTable" maxWidth="480.0" prefHeight="140.0" prefWidth="480.0" GridPane.rowIndex="2">
            <columns>
                <TableColumn fx:id="partIdColumn" maxWidth="120.0" prefWidth="120.0" text="Part ID" />
                <TableColumn fx:id="partNameColumn" maxWidth="120.0" prefWidth="120.0" text="Part Name" />
                <TableColumn fx:id="partInvLevel" maxWidth="120.0" prefWidth="120.0" text="Inventory Level" />
                <TableColumn fx:id="partPriceCostColumn" maxWidth="120.0" prefWidth="120.0" text="Price/Cost per Unit" />
            </columns>
            <GridPane.margin>
                <Insets left="60.0" />
            </GridPane.margin>
        </TableView>
        <ButtonBar maxWidth="480.0" prefHeight="40.0" prefWidth="250.0" GridPane.rowIndex="3">
            <buttons>
                <Button mnemonicParsing="false" onAction="#addPartWindow" text="Add" />
                <Button mnemonicParsing="false" text="Modify" />
                <Button mnemonicParsing="false" text="Delete" />
            </buttons>
            <GridPane.margin>
                <Insets bottom="10.0" left="30.0" />
            </GridPane.margin>
        </ButtonBar>
        <Text strokeType="OUTSIDE" strokeWidth="0.0" text="Parts" GridPane.rowIndex="1">
            <GridPane.margin>
                <Insets bottom="10.0" left="70.0" top="20.0" />
            </GridPane.margin>
            <font>
                <Font name="Helvetica Bold" size="16.0" />
            </font>
        </Text>
        <Button mnemonicParsing="false" text="Search" GridPane.rowIndex="1">
            <GridPane.margin>
                <Insets left="260.0" top="10.0" />
            </GridPane.margin>
        </Button>
        <TextField maxWidth="200.0" GridPane.rowIndex="1">
            <GridPane.margin>
                <Insets left="340.0" top="11.0" />
            </GridPane.margin>
        </TextField>
        <Rectangle arcHeight="15.0" arcWidth="15.0" fill="#1f93ff00" height="260.0" stroke="#949494" strokeType="INSIDE" width="520.0" GridPane.columnIndex="1" GridPane.rowIndex="1" GridPane.rowSpan="3">
            <GridPane.margin>
                <Insets left="40.0" />
            </GridPane.margin>
        </Rectangle>
        <TableView fx:id="productsTable" maxWidth="480.0" prefHeight="140.0" prefWidth="480.0" GridPane.columnIndex="1" GridPane.rowIndex="2">
            <columns>
                <TableColumn prefWidth="120.0" text="Part ID" />
                <TableColumn prefWidth="120.0" text="Part Name" />
                <TableColumn prefWidth="120.0" text="Inventory Level" />
                <TableColumn prefWidth="120.0" text="Price per Unit" />
            </columns>
            <GridPane.margin>
                <Insets left="60.0" />
            </GridPane.margin>
        </TableView>
        <ButtonBar maxWidth="480.0" prefHeight="40.0" prefWidth="250.0" GridPane.columnIndex="1" GridPane.rowIndex="3">
            <buttons>
                <Button mnemonicParsing="false" text="Add" />
                <Button mnemonicParsing="false" text="Modify" />
                <Button mnemonicParsing="false" text="Delete" />
            </buttons>
            <GridPane.margin>
                <Insets bottom="10.0" left="30.0" />
            </GridPane.margin>
        </ButtonBar>
        <Button mnemonicParsing="false" text="Search" GridPane.columnIndex="1" GridPane.rowIndex="1">
            <GridPane.margin>
                <Insets left="260.0" top="10.0" />
            </GridPane.margin>
        </Button>
        <TextField maxWidth="200.0" GridPane.columnIndex="1" GridPane.rowIndex="1">
            <GridPane.margin>
                <Insets left="340.0" top="11.0" />
            </GridPane.margin>
        </TextField>
        <Button mnemonicParsing="false" text="Exit" GridPane.columnIndex="1" GridPane.halignment="RIGHT" GridPane.rowIndex="4">
            <GridPane.margin>
                <Insets right="60.0" top="10.0" />
            </GridPane.margin>
        </Button>
        <Text strokeType="OUTSIDE" strokeWidth="0.0" text="Products" GridPane.columnIndex="1" GridPane.rowIndex="1">
            <font>
                <Font name="Helvetica Bold" size="16.0" />
            </font>
            <GridPane.margin>
                <Insets bottom="10.0" left="70.0" top="20.0" />
            </GridPane.margin>
        </Text>
    </children>
</GridPane>

addpart.fxml:

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.geometry.Insets?>
<?import javafx.scene.Group?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.ButtonBar?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.RadioButton?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.control.ToggleGroup?>
<?import javafx.scene.layout.ColumnConstraints?>
<?import javafx.scene.layout.GridPane?>
<?import javafx.scene.layout.RowConstraints?>
<?import javafx.scene.text.Font?>
<?import javafx.scene.text.Text?>

<GridPane fx:id="partGrid" style="-fx-background-color: lightgrey;" xmlns="http://javafx.com/javafx/8.0.171"
          xmlns:fx="http://javafx.com/fxml/1" fx:controller="wesleyoneal.inventoryapp.Part">
    <columnConstraints>
        <ColumnConstraints/>
        <ColumnConstraints/>
        <ColumnConstraints/>
    </columnConstraints>
    <rowConstraints>
        <RowConstraints/>
        <RowConstraints prefHeight="60.0"/>
        <RowConstraints prefHeight="60.0"/>
        <RowConstraints prefHeight="60.0"/>
        <RowConstraints minHeight="10.0" prefHeight="60.0"/>
        <RowConstraints minHeight="10.0" prefHeight="60.0"/>
        <RowConstraints minHeight="10.0" prefHeight="60.0"/>
        <RowConstraints minHeight="10.0"/>
    </rowConstraints>
    <children>
        <Label text="Add Part" textFill="#494980">
            <font>
                <Font name="Helvetica Bold" size="16.0"/>
            </font>
            <GridPane.margin>
                <Insets bottom="30.0" left="40.0" top="30.0"/>
            </GridPane.margin>
        </Label>
        <Text id="partIdLabel" strokeType="OUTSIDE" strokeWidth="0.0" text="ID" GridPane.rowIndex="1">
            <GridPane.margin>
                <Insets bottom="10.0" left="80.0" top="10.0"/>
            </GridPane.margin>
        </Text>
        <Text id="partNameLabel" strokeType="OUTSIDE" strokeWidth="0.0" text="Name" GridPane.rowIndex="2">
            <GridPane.margin>
                <Insets bottom="10.0" left="80.0" top="10.0"/>
            </GridPane.margin>
        </Text>
        <Text id="partInvLabel" strokeType="OUTSIDE" strokeWidth="0.0" text="Inv" GridPane.rowIndex="3">
            <GridPane.margin>
                <Insets bottom="10.0" left="80.0" top="10.0"/>
            </GridPane.margin>
        </Text>
        <Text id="partPriceCostLabel" strokeType="OUTSIDE" strokeWidth="0.0" text="Price/Cost" GridPane.rowIndex="4">
            <GridPane.margin>
                <Insets bottom="10.0" left="80.0" top="10.0"/>
            </GridPane.margin>
        </Text>
        <Text id="partMaxLabel" strokeType="OUTSIDE" strokeWidth="0.0" text="Max" GridPane.rowIndex="5">
            <GridPane.margin>
                <Insets bottom="10.0" left="80.0" top="10.0"/>
            </GridPane.margin>
        </Text>
        <Text id="partMinLabel" strokeType="OUTSIDE" strokeWidth="0.0" text="Min" GridPane.columnIndex="1"
              GridPane.columnSpan="2" GridPane.rowIndex="5">
            <GridPane.margin>
                <Insets left="180.0"/>
            </GridPane.margin>
        </Text>
        <Text id="partCompanyNameLabel" strokeType="OUTSIDE" strokeWidth="0.0" text="Company Name"
              GridPane.rowIndex="6">
            <GridPane.margin>
                <Insets bottom="10.0" left="80.0" top="10.0"/>
            </GridPane.margin>
        </Text>
        <Text id="partMachineIdLabel" strokeType="OUTSIDE" strokeWidth="0.0" text="Machine ID" GridPane.rowIndex="6">
            <GridPane.margin>
                <Insets bottom="10.0" left="80.0" top="10.0"/>
            </GridPane.margin>
        </Text>
        <ButtonBar prefHeight="40.0" prefWidth="200.0" GridPane.columnIndex="2" GridPane.halignment="RIGHT"
                   GridPane.rowIndex="7">
            <buttons>
                <Button mnemonicParsing="false" text="Save"/>
                <Button mnemonicParsing="false" text="Cancel"/>
            </buttons>
            <GridPane.margin>
                <Insets bottom="20.0" right="30.0"/>
            </GridPane.margin>
        </ButtonBar>
        <Group GridPane.columnIndex="1" GridPane.columnSpan="2">
            <children>
                <RadioButton fx:id="partInHouseButton" mnemonicParsing="false"
                             prefWidth="100.0" selected="true" text="In-House">
                    <toggleGroup>
                        <ToggleGroup fx:id="addPartToggleGroup"/>
                    </toggleGroup>
                </RadioButton>
                <RadioButton fx:id="partOutsourcedButton" layoutX="183.0" mnemonicParsing="false"
                             prefWidth="100.0" text="Outsourced"
                             toggleGroup="$addPartToggleGroup"/>
            </children>
        </Group>
        <TextField id="partIdField" editable="false" prefHeight="40.0"
                   style="-fx-background-color: lightgrey; -fx-border-color: grey;" text="Auto Gen - Disabled"
                   GridPane.columnIndex="1" GridPane.rowIndex="1">
            <GridPane.margin>
                <Insets left="20.0"/>
            </GridPane.margin>
        </TextField>
        <TextField id="partNameField" prefHeight="40.0" GridPane.columnIndex="1" GridPane.rowIndex="2">
            <GridPane.margin>
                <Insets left="20.0"/>
            </GridPane.margin>
        </TextField>
        <TextField id="partInvField" prefHeight="40.0" GridPane.columnIndex="1" GridPane.rowIndex="3">
            <GridPane.margin>
                <Insets left="20.0"/>
            </GridPane.margin>
        </TextField>
        <TextField id="partPriceCostField" prefHeight="40.0" GridPane.columnIndex="1" GridPane.rowIndex="4">
            <GridPane.margin>
                <Insets left="20.0"/>
            </GridPane.margin>
        </TextField>
        <TextField id="partMaxField" maxWidth="120.0" prefHeight="40.0" GridPane.columnIndex="1" GridPane.rowIndex="5">
            <GridPane.margin>
                <Insets left="20.0"/>
            </GridPane.margin>
        </TextField>
        <TextField id="partMinField" maxWidth="120.0" prefHeight="40.0" GridPane.columnIndex="2" GridPane.rowIndex="5">
            <GridPane.margin>
                <Insets left="40.0" right="40.0"/>
            </GridPane.margin>
        </TextField>
        <TextField id="partCompanyNameField" prefHeight="40.0" GridPane.columnIndex="1" GridPane.rowIndex="6">
            <GridPane.margin>
                <Insets left="20.0"/>
            </GridPane.margin>
        </TextField>
        <TextField id="partMachineIdField" prefHeight="40.0" GridPane.columnIndex="1" GridPane.rowIndex="6">
            <GridPane.margin>
                <Insets left="20.0"/>
            </GridPane.margin>
        </TextField>
    </children>
</GridPane>

Part.java:

package wesleyoneal.inventoryapp;

public abstract class Part {
    private int id;
    private String name;
    private double price;
    private int stock;
    private int min;
    private int max;

    public Part(int id, String name, double price, int stock, int min, int max) {
        this.id = id;
        this.name = name;
        this.price = price;
        this.stock = stock;
        this.min = min;
        this.max = max;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

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

    public double getPrice() {
        return price;
    }

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

    public int getStock() {
        return stock;
    }

    public void setStock(int stock) {
        this.stock = stock;
    }

    public int getMin() {
        return min;
    }

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

    public int getMax() {
        return max;
    }

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

InHousePart.java:

package wesleyoneal.inventoryapp;

public class InHousePart extends Part {

    private int machineId;

    public InHousePart(int id, String name, double price, int stock, int min, int max, int machineId) {
        super(id, name, price, stock, min, max);
        this.machineId = machineId;
    }

    public int getMachineId() {
        return machineId;
    }

    public void setMachineId(int machineId) {
        this.machineId = machineId;
    }
}

Outsourcedpart.java:

package wesleyoneal.inventoryapp;

public class OutsourcedPart extends Part {

    private String companyName;

    public OutsourcedPart(int id, String name, double price, int stock, int min, int max, String companyName) {
        super(id, name, price, stock, min, max);
        this.companyName = companyName;
    }

    public String getCompanyName() {
        return companyName;
    }

    public void setCompanyName(String companyName) {
        this.companyName = companyName;
    }
}
  • You declare the controller class for `add part.fxml` to be `Part`, which will cause the `FXMLLoader` to instantiate it be calling the no-arg constructor. However, your `Part` class doesn’t have a no-arg constructor, causing the exception – James_D Jul 18 '20 at 00:12
  • Why would it try to call a no-arg constructor when I have a constructor with arguments already in there? I'm not 100% sure how all of that is supposed to work – vazznation Jul 18 '20 at 00:51
  • Because that’s what the `FXMLLoader` does. How would it know what values to pass for the parameters? – James_D Jul 18 '20 at 01:19
  • By default, an `FXMLLoader` attempts to create the controller specified by `fx:controller` via reflection by using the no-argument constructor. If there is no such constructor then you get a `NoSuchMethodException`. There are ways around this "limitation", covered by existing Q&As on Stack Overflow, if you really need to define a constructor with parameters in your controller class. However, you have another problem: You've defined `wesleyoneal.inventoryapp.Part` as the controller but that class is abstract, meaning it cannot be instantiated. That class looks like a model class anyway. – Slaw Jul 18 '20 at 06:02
  • I was thinking of abstract classes backwards. Got it figured out from your comments. Thanks! – vazznation Jul 20 '20 at 21:46

0 Answers0