2016-05-29 166 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註解的方法。