2016-12-16 4 views
1

私はJavaFXアプリケーションを設計しており、別のウィンドウのController内のウィンドウの1つのApplicationクラスを呼び出す必要があります。Javaの別のクラスのメソッドでクラスのすべてのメソッドを呼び出す方法

MainController.java:

public class MainController { 

    @FXML 
    public Button buttonLogin; 

    @FXML 
    public Button buttonNeuAnmelden; 

    @FXML 
    public void handleButtonLoginAction(ActionEvent event) { 
    ((Node) (event.getSource())).getScene().getWindow().hide(); 
    System.out.println("LoginButton geclickt!"); 

    } 

    @FXML 
    public void handleButtonNeuAnmeldenAction(ActionEvent event) { 
    ((Node) (event.getSource())).getScene().getWindow().hide(); 
    System.out.println("NeuAnmeldenButton Geclickt!"); 

    } 

} 

LoginApp.java:

public class LoginApp extends Application { 

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

    @Override 
    public void start(Stage primaryStage) throws Exception { 
    FXMLLoader loader = new FXMLLoader(
     getClass().getResource("/design/Login.fxml")); 
    Parent root = loader.load(); 
    primaryStage.setTitle("Benutzerverwaltung"); 
    primaryStage.setScene(new Scene(root)); 
    primaryStage.show(); 
    } 
} 
私は、具体的 handleButtonLoginAction()方法で main(String[] args)start(Stage primaryStage)クラスを意味し、 LoginAppのすべてのメソッドを実行する必要が

あたかもクラス全体がそのままその時点で呼び出されたかのように見えます。

どうすればよいですか?

+0

*をこれはどういう意味ですか?あなたは "クラスを呼び出す"ではなく、メソッドを呼び出します。また、 'main(...)'メソッドは、 'once(一度しか呼び出されない)'を呼び出す 'launch()'メソッドを呼び出します(http://docs.oracle.com/javase/8/javafx/api/javafx/application/Application .html#launch-java.lang.String ...-)をアプリケーションの存続期間中に使用します。 –

+0

しかし、あなたはまだクラスが何らかの形で実行可能であることを暗示しています: "そのクラスは何をしていますか"。クラスは何もしません。クラスのメソッドは何かを行います。実際に何をしようとしていますか?たとえあなたがここで意味をなさない言語にしても、それは意味的には意味をなさない。 'Application'クラスはアプリケーション全体とそのライフサイクルを表します。任意のJVMに 'Application'インスタンスを1つだけ持たなければなりません。また、アプリケーションを起動するときに' start() 'メソッドが呼び出されます。アプリケーション内からアプリケーションを起動するのは実際には意味がありません。 –

+0

だから私はそれが好きだと言った!私はあなたがクラスを呼び出すことができないことを知っているので。しかし、私はそのクラスがイベントハンドラのその時点で何をしているのか正確に必要としています... – Bahador

答えて

2

質問を正しく理解していれば、これをかなりリファクタリングする必要があります。あなたのApplicationサブクラスとは無関係ですLoginViewクラス定義:

public class LoginView { 

    private final Stage displayStage ; 

    private final Scene scene ; 

    public LoginView(Stage displayStage) throws IOException { 
     this.displayStage = displayStage ; 
     FXMLLoader loader = new FXMLLoader(
      getClass().getResource("/design/Login.fxml")); 
     Parent root = loader.load();   
     scene = new Scene(root); 
     displayStage.setScene(scene); 
     displayStage.setTitle("Benutzerverwaltung"); 
    } 

    public LoginView() throws IOException { 
     this(new Stage()); 
    } 

    public void show() { 
     displayStage.show(); 
    } 

    public void hide() { 
     displayStage.hide(); 
    } 

    // ... 
} 

をして、あなたのApplicationクラスには、次のようになります。

public class LoginApp extends Application { 

    @Override 
    public void start(Stage primaryStage) throws IOException { 
     LoginView loginView = new LoginView(primaryStage); 
     // ... 
     loginView.show(); 
    } 
} 

ご質問はMainControllerがアプリケーションに関連している方法を示しますが、すべてではありませんでしたMainControllerに作成したloginViewへの参照を渡して、MainControllerのメソッドからloginView.show()を呼び出してください。

+0

アプリケーションをAppに分けて表示し、Showメソッドを追加して他のクラスでそれらを使用することは答えでした...ありがとう! – Bahador

0

あなたがソフトウェアアーキテクチャをリファクタリングしたくない場合は、Reflectionを試してみてください、とのような何かを行うことができます。何*「クラス全体が呼び出されていたかのように」

public static Method[] getAccessibleMethods(Class clazz) { 
List<Method> result = new ArrayList<Method>(); 
while (clazz != null) { 
    for (Method method : clazz.getDeclaredMethods()) { 
     int modifiers = method.getModifiers(); 
     if (Modifier.isPublic(modifiers) || Modifier.isProtected(modifiers)) { 
      result.add(method); 
     } 
    } 
    clazz = clazz.getSuperclass(); 
} 
return result.toArray(new Method[result.size()]); 

}

+0

しかし、これらのすべてを起動しようとすると、 'launch'が呼び出されます。すでに1回呼び出されているので、これは 'IllegalStateException'をスローします。フレームワークによって呼び出されることを意図したアプリケーションクラス内のメソッド呼び出しの概念全体は、JavaFXアプリケーションのライフサイクル要件すべてに違反します。 –

+0

Reflectionでクラスのすべてのメソッドを取得する例です。この関数で指定されていないメソッド呼び出しコードにexcepotinsを追加することで、関数呼び出しの起動などを省略することができます。 –

関連する問題