2016-05-29 120 views
0

我正在创建一个应用程序,将FXML和常规javaFX组合起来创建应用程序。然而,我正在为编写一个名为AddItemWindow的Stage-subclass的EventHandler生成自定义窗口时遇到问题。Java GUI(使用FXML):

该应用程序显示清单中的物品清单(键和武器)。用户可以添加物品,并且需要按下一个按钮来添加他选择的物品(添加键或添加武器)。

弹出一个新窗口,用户必须输入相关数据。它将生成一个带有TextField的GridPane,用户可以在其中输入数据。这将是一个自定义GridPane,具体取决于ItemType。然后它将加载FXML并添加GridPane。

使用下面的代码,我得到了用于取消窗口或确认新项目的按钮的SetOnAction代码的LoadExceptions。

任何人都知道我在哪里发生错误?

/* StartUp Class */ package main;

//imports from javafx and java 
import domain.DomainController; 
import gui.OverviewWindow; 

public class StartUpGUI extends Application { 

    @Override 
    public void start(Stage primaryStage) { 
     Parent root = new OverviewWindow(new DomainController()); 

     Scene scene = new Scene(root); 

     primaryStage.setTitle("Weapons and Keys"); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 

    public static void main(String... args) { 
     Application.launch(StartUpGUI.class, args); 
    } 

} 

/* OverviewWindow,BorderPane */ 包GUI的子类;

//imports from javafx and java 
import domain.DomainController; 
import domain.ItemType; 

public class OverviewWindow extends BorderPane{ 

    @FXML 
    private Button btnAddWeapon; 
    @FXML 
    private Button btnAddKey; 
    @FXML 
    private TextArea txaOverview; 

    private DomainController dc; 

     this.dc = dc; 

     FXMLLoader loader = new FXMLLoader(getClass().getResource("OverviewWindow.fxml")); 
     loader.setRoot(this); 
     loader.setController(this); 
     try{ 
      loader.load(); 
      txaOverview.setText(dc.showOverview()); // showOverview returns a String containing a toString of all items in the inventory 
     } 
     catch (IOException ex){ 
      throw new RuntimeException(ex); 
     } 
    } 

    @FXML 
    public void btnAddWeaponOnAction(ActionEvent event){ 
     try{ 
      add(ItemType.WEAPON); // ItemType is an Enum where all the properties of the items are defined; for Weapon: name, weight, level, power, used(boolean) 
     } 
     catch (Exception e){ 
      throw e; 
     } 
    } 

    @FXML 
    public void btnAddKeyOnAction(ActionEvent event){ 
     try{ 
      add(ItemType.SLEUTEL); // ItemType is an Enum where all the properties of the items are defined; for Key: name, weight, level, door 
     } 
     catch (Exception e){ 
      throw e; 
     } 
    } 

    private void add(ItemType itemType){ 
     Stage stage = new Stage(); 
     stage.setTitle(itemType== VoorwerpSoort.WEAPON ? "Add Weapon" : "Add Key"); 
     AddItem addItem = new AddItem(dc,itemType,this); 

     addItem.setOnHiding(new EventHandler<WindowEvent>(){ 
      @Override 
      public void handle(WindowEvent e){ 
       txaOverview.setText(dc.showOverview()); // when we close the AddItemWindow, we will update the item overview by having the domain controller get this data from the repository 
      } 
     }); 

     addItem.show(); 
    } 
} 

/* AddItemWindow,阶段*/ 包GUI的一个子类;

// import relevant javafx and java classes 
import domain.DomainController; 
import domain.ItemType; 

public class AddItemWindow extends Stage { 

    @FXML 
    private BorderPane addRoot; 
    @FXML 
    private Button btnOK; 
    @FXML 
    private Button btnCancel; 

    private DomainController dc; 
    private ItemType itemType; 
    private Parent parent; 

    private TextField[] txfAttributes; 

    public AddItemWindow(DomainController dc, ItemType itemType, OverviewWindow overviewWindow){ 
     this.dc = dc; 
     this.itemType = itemType; 
     this.parent = overviewWindow; 
     this.setScene(buildGUI(dc,itemType,overviewWindow)); 
    } 

    private Scene buildGUI(DomeinController dc, VoorwerpSoort vwps, OverzichtSchermController ovsController){ 
     Parent root = new BorderPane(); 

     GridPane properties = new GridPane(); 

     properties.setPadding(new Insets(10)); 
     properties.setHgap(10); 
     properties.setVgap(10); 

     ColumnConstraints col1 = new ColumnConstraints(); 
     col1.setHalignment(HPos.RIGHT); 
     ColumnConstraints col2 = new ColumnConstraints(); 
     properties.getColumnConstraints().addAll(col1, col2); 

     String[] attributes = itemType.attributeNames(); 
     txfAttributes = new TextField[attributes.length]; 

     for(int i = 0; i<attributes.length; i++){ 
      properties.add(new Label(attributes[i]),0,i); 
      properties.add(txfAttributes[i] = new TextField(),1,i); 
     } 

     ((BorderPane) root).setCenter(properties); 

     FXMLLoader loader = new FXMLLoader(getClass().getResource("AddItemWindow.fxml")); 
     loader.setRoot(root); 
     loader.setController(root); 
     try{ 
      loader.load(); 
      return new Scene(root); 
     } 
     catch(IOException e){ 
      throw new RuntimeException(e); 
     } 
    } 


    // NOT WORKING 
    @FXML 
    public void btnOKOnAction(){ 
     addItem(); 
    } 

    // NOT WORKING 
    @FXML 
    public void btnCancelOnAction(ActionEvent event){ 
     hide(); 
    } 

    private void voorwerpToevoegen(){ // we're calling the domaincontroller to add the new item to the repository 
     switch (itemType) 
     { 
    // for the item, add an item by getting the value of each TextField, which are the 
    // parameters for a constructor of the new item   
      case WEAPON: 
       dc.addWeapon(txfAttributes[0].getText(), 
        Double.parseDouble(txfAttributes[1].getText()), 
        Integer.parseInt(txfAttributes[2].getText()), 
        Integer.parseInt(txfAttributes[3].getText()), 
        Boolean.parseBoolean(txfAttributes[4].getText())); 
       break; 
      case KEY: 
       dc.addKey(txfAttributes[0].getText(), 
        Double.parseDouble(txfAttributes[1].getText()), 
        Integer.parseInt(txfAttributes[2].getText()), 
        Integer.parseInt(txfAttributes[3].getText())); 
       break; 
     } 
     hide(); 
    } 
} 
+0

编辑:AddItemWindow类中的私有方法voorwerpToevoegen()应该被称为** addItem()**。 Translation oversight ...另外:如果省略AddItemWindow按钮的代码,则OverviewWindow上的按钮可以正常工作。 –

回答

0

在顶部你有@FXML private Button btnOK;这是很好的。

要指定Java代码按钮的操作,你可以在你buildGUI()方法使用的Java语法8(见JavaFX 8 Event Handling Examples):

btnOK.setOnAction((event) -> addItem()); 

如果你没有使用Java 8,看UI Control Sample。您不需要用@FXML注解的方法。