2015-10-03 2 views
-1

Я создаю приложение JavaFx, и я хочу создать метод, который получает GridPane и узел [] с количеством элементов, добавляемых в панель. Однако, когда я вызываю метод, я получаю исключение NoSuchMethodException.Java NoSuchMethodException - метод существует в классе

В качестве теста я попытался создать простой метод private String helloWorld(), который бы return "Hello World";. Этот метод действительно работает, но когда я пытаюсь запустить gridLogin = buildForm(gridLogin, items);, я получаю ошибку Exception in thread "main" java.lang.NoSuchMethodException.

Application.java

public class DesktopApplication extends Application { 

    @Override 
    public void start(Stage primaryStage) { 
     BuildGraphicalUserInterface ui = new BuildGraphicalUserInterface(); 
     ui.initStage(primaryStage); 
    } 
} 

BuildGraphicalUserInterface.java

package com.fenrir.desktop.UserInterface; 

import ...; 

public class BuildGraphicalUserInterface { 

    private final String APP_TITLE = "Fenrir Desktop App"; 
    private final String LOGIN_HEADER = "FENRIR secure"; 

    Stage stage; 
    Scene sceneLogin, sceneMain, sceneRegister; 
    GridPane gridLogin, gridMain, gridRegister; 

    long startTime, endTime; 

    boolean authorized; 
    Optional<String> result; 

    public void initStage(Stage primaryStage) { 
     stage = primaryStage; 
//  Set global ui options 
     stage.setTitle(APP_TITLE); 
     stage.setResizable(false); 

//  Setup every screen in application 
     initScenes(stage); 
    } 

    private void initScenes(Stage stage) { 
     startTime = System.nanoTime(); 
     sceneLogin = buildLoginScreen(); 
     endTime = System.nanoTime(); 
     System.out.println("login:\t" + (endTime - startTime)); 

     startTime = System.nanoTime(); 
     sceneMain = buildMainScreen(); 
     endTime = System.nanoTime(); 
     System.out.println("main:\t" + (endTime - startTime)); 

     startTime = System.nanoTime(); 
     sceneRegister = buildRegisterScreen(); 
     endTime = System.nanoTime(); 
     System.out.println("register:\t" + (endTime - startTime)); 
     stage.setScene(sceneLogin); 
     stage.show(); 
    } 

// BUILD OF SCREENS 
    private Scene buildLoginScreen() { 
     gridLogin = new GridPane(); 
     gridLogin.setAlignment(Pos.CENTER); 
     gridLogin.setVgap(10); 
     gridLogin.setHgap(10); 

     Text loginTitle = new Text(LOGIN_HEADER); 
     loginTitle.setFont(Font.font("Tahoma", FontWeight.NORMAL, 20)); 
     Label usernameLabel = new Label("Username:"); 
     final TextField usernameTextField = new TextField(); 
     Label companyLabel = new Label("Company:"); 
     final TextField companyTextField = new TextField(); 
     Button loginButton = new Button("Login"); 
     Hyperlink registerLink = new Hyperlink(); 
     registerLink.setText("Register"); 

     registerLink.setOnAction(new EventHandler<ActionEvent>() { 
      public void handle(ActionEvent e) { 
       stage.setScene(sceneRegister); 
      } 
     }); 

     loginButton.setOnAction(new EventHandler<ActionEvent>() { 
      public void handle(ActionEvent e) { 
       UserAuthentication auth = new UserAuthentication(usernameTextField.getText(), companyTextField.getText()); 
       try { 
//     check if user exists 
        auth.authenticate(); 

//     show token pop up 
        promptTokenAlert(); 
        if (result.isPresent()) { 
         if (auth.verifyToken(result.get())) { 
          authorized = true; 
          stage.setScene(sceneMain); 
         } 
         else 
          wrongTokenAlert(); 
        } 
       } catch (IOException e1) { 
        userNotFoundAlert(); 
        usernameTextField.setText(""); 
        companyTextField.setText(""); 
       } 
      }}); 

     Node[] items = new Node[6]; 
     items[0] = loginTitle; 
     items[1] = usernameLabel; 
     items[2] = usernameTextField; 
     items[3] = companyLabel; 
     items[4] = companyTextField; 
     items[5] = loginButton; 
     items[6] = registerLink; 
     gridLogin = buildForm(gridLogin, items); 

     sceneLogin = new Scene(gridLogin, 300, 200); 

     return sceneLogin; 
    } 

    private Scene buildMainScreen() { 
     gridMain = new GridPane(); 

     final Label authorizedLabel = new Label("Authorized!"); 
     Button logoutButton = new Button("Logout"); 

     logoutButton.setOnAction(new EventHandler<ActionEvent>() { 
      public void handle(ActionEvent e) { 
       authorized = false; 
       stage.setScene(sceneLogin); 
      }}); 

     gridMain.add(authorizedLabel, 0, 0); 
     gridMain.add(logoutButton, 0, 1); 
     sceneMain = new Scene(gridMain, 800, 600); 

     return sceneMain; 
    } 

    private Scene buildRegisterScreen() { 
     gridRegister = new GridPane(); 
     gridRegister.setAlignment(Pos.CENTER); 
     gridRegister.setVgap(10); 
     gridRegister.setHgap(10); 
     sceneRegister = new Scene(gridRegister, 300, 200); 

     Label userName = new Label("Username:"); 
     final TextField userTextField = new TextField(); 
     Label company = new Label("Company:"); 
     final TextField companyTextField = new TextField(); 
     Label phoneNumber = new Label("Phone nr.:"); 
     final TextField phoneNumberTextField = new TextField(); 
     Button registerButton = new Button("Register"); 
     Hyperlink returnLabel = new Hyperlink(); 
     returnLabel.setText("Go back"); 

     returnLabel.setOnAction(new EventHandler<ActionEvent>() { 
      public void handle(ActionEvent e) { 
       stage.setScene(sceneLogin); 
      } 
     }); 
     registerButton.setOnAction(new EventHandler<ActionEvent>() { 
      public void handle(ActionEvent event) { 
       /** 
       * register response 
       * 1 - user already exists 
       * 2 - incorrect username 
       * 3 - incorrect phonenumber 
       * 4 - unknown error 
       * 0 - success 
       */ 
       int registerResponse; 
       UserRegistration userReg = new UserRegistration(userTextField.getText(), companyTextField.getText(), phoneNumberTextField.getText()); 
       try { 
        registerResponse = userReg.Register(); 
       } catch (IOException e) { 
        registerResponse = 4; 
        e.printStackTrace(); 
       } 
       if (registerResponse == 0) { 
        userRegisteredConfirmation(); 
        stage.setScene(sceneLogin); 
       } else { 
        userRegistrationErrorAlert(registerResponse); 
       } 
      } 
     }); 

     gridRegister.add(userName, 0, 1); 
     gridRegister.add(userTextField, 1, 1); 
     gridRegister.add(company, 0, 2); 
     gridRegister.add(companyTextField, 1, 2); 
     gridRegister.add(phoneNumber, 0, 3); 
     gridRegister.add(phoneNumberTextField, 1, 3); 
     gridRegister.add(registerButton, 1, 4); 
     gridRegister.add(returnLabel, 0, 4); 

     return sceneRegister; 
    } 

    /** 
    * Builds a form with items received (items should be sorted) 
    * @param grid 
    * @param items 
    * @return 
    */ 
    private GridPane buildForm(GridPane grid, Node[] items) { 
     int row = 0; 
     for (int i = 0; i < items.length; i++) { 
      grid.add(items[i], i, row); 
      if (i % 2 == 0) 
       row++; 
     } 

     return grid; 
    } 

// ALERTS 
    /** 
    * Alert is shown when service returns no user 
    * @return 
    */ 
    private Alert userNotFoundAlert() { 
     Alert alert = new Alert(Alert.AlertType.ERROR); 
     alert.setTitle("FENRIR security"); 
     alert.setHeaderText("Error"); 
     alert.setContentText("User not recognized"); 
     alert.showAndWait(); 
     return alert; 
    } 

    /** 
    * Alert is shown when user should enter token 
    * @return 
    */ 
    private TextInputDialog promptTokenAlert() { 
     TextInputDialog alert = new TextInputDialog(""); 
     alert.setTitle("FENRIR security"); 
     alert.setHeaderText("Token requested"); 
     result = alert.showAndWait(); 
     return alert; 
    } 

    /** 
    * Alert is shown when entered token is wrong 
    * @return 
    */ 
    private Alert wrongTokenAlert() { 
     Alert alert = new Alert(Alert.AlertType.ERROR); 
     alert.setTitle("FENRIR security"); 
     alert.setHeaderText("Token incorrect"); 
     alert.showAndWait(); 
     return alert; 
    } 

    /** 
    * Confirmation is shown when registration is completed 
    * @return 
    */ 
    private Alert userRegisteredConfirmation() { 
     Alert alert = new Alert(Alert.AlertType.INFORMATION); 
     alert.setTitle("FENRIR security"); 
     alert.setHeaderText("Success"); 
     alert.setContentText("Registration completed"); 
     alert.showAndWait(); 
     return alert; 
    } 

    /** 
    * Alert is shown when an error occurs during registration 
    * @param errorCode 
    * @return 
    */ 
    private Alert userRegistrationErrorAlert(int errorCode) { 
     Alert alert = new Alert(Alert.AlertType.ERROR); 
     alert.setTitle("FENRIR security"); 
     alert.setHeaderText("Error"); 
     String errorMessage; 
     switch (errorCode) { 
      case 1: errorMessage = "User already exists."; 
       break; 
      case 2: errorMessage = "Incorrect username. Username should be at least 2 characters."; 
       break; 
      case 3: errorMessage = "Incorrect phone number. Should be 8 characters and only numbers."; 
       break; 
      default: errorMessage = "Unknown error. Contact administrator."; 
     } 
     alert.setContentText(errorMessage); 
     alert.showAndWait(); 
     return alert; 
    } 
} 

Стек след

Exception in Application start method 
Exception in thread "main" java.lang.NoSuchMethodException: com.fenrir.desktop.DesktopApplication.main([Ljava.lang.String;) 
    at java.lang.Class.getMethod(Class.java:1786) 
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:125) 

Process finished with exit code 1 
+0

Я предполагаю, что javaFX использует внешний компилятор для компиляции вашего нового кода. После сохранения кода вы снова создадите свой проект. –

+0

@AfsinBuyuksarac Использование IntelliJ; перезапустил, сделал проект, сделал недействительным кеш - ничего не получилось. Спасибо, что предложили tho. – Lars

+0

BuildGraphicalUserInterface или BuildGUI.java? – ergonaut

ответ

1

Это решит вашу проблему, установит e (fx) клипс этого плагина для eclise, но я не знаю, для intellij, или добавьте грань для вашего приложения в качестве приложения javafx, если вы добавите грань, вам не нужен основной метод, или используйте это как

public class DesktopApplication extends Application { 

    @Override 
    public void start(Stage primaryStage) { 
     BuildGraphicalUserInterface ui = new BuildGraphicalUserInterface(); 
     ui.initStage(primaryStage); 
    } 

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

 Смежные вопросы

  • Нет связанных вопросов^_^