2016-05-29 5 views
0

Я создаю приложение, в котором я объединяю FXML и обычный javaFX для создания приложения. Однако у меня возникают проблемы с написанием EventHandlers для подкласса Stage под названием AddItemWindow, который генерирует пользовательские окна.Java GUI (с использованием FXML):

Приложение отображает список предметов (ключей и оружия) в инвентаре. Пользователь может добавлять элементы и должен нажать кнопку, чтобы добавить элемент по своему выбору (Добавить ключ или добавить оружие).

Затем появляется новое окно, в котором пользователь должен ввести соответствующие данные. Он будет генерировать GridPane с TextFields, где пользователь может вводить данные. Это будет настраиваемая GridPane, в зависимости от ItemType. Затем он загрузит FXML и добавит GridPane.

С приведенным ниже кодом я получаю LoadExceptions для моего кода SetOnAction для кнопок, отменяющих окно или подтверждающих новый элемент.

Кто-нибудь знает, где я делаю ошибку?

/* StartUp Class */ упаковка основная;

//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 */ пакет графического интерфейса;

//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, подкласс Stage */ пакет графического интерфейса;

// 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

Редактировать: этот частный метод voorwerpToevoegen() в классе AddItemWindow следует называть ** addItem() **. Контроль над переводом ... Также: кнопки в обзореWindow работают нормально, если я не оставляю код кнопки AddItemWindow. –

ответ

0

Наверху у вас есть @FXML private Button btnOK;, что хорошо.

Чтобы указать действие баттона в Java коде, вы можете использовать этот синтаксис Java 8 в методе buildGUI() (см JavaFX 8 Event Handling Examples):

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

Если вы не используете Java 8 см UI Control Sample.

Вам не нужны методы, аннотированные с помощью @FXML.