2016-05-12 7 views
0

私は長い間書いていません。ポイントに直接行きましょう。ビューの切り替え時にJavaFXコンパイルされたアプリケーションの問題

私が書いたJavaFXアプリケーションには奇妙な問題があります。私はJavaの初心者として始めました、私の仕事は終了し、それをコンパイルする必要はありませんが、これはプログラミングと同様に重要なので、私は試してみました。

私はeclipseとe(fx)clipseを使ってアプリケーションを開発しましたが、Eclipseでコンパイルできなかったので、私はIntelliJ 2016.1.1(64)をこの目的に使用しました。

この問題は、fxmlと明らかに関連するコントローラの間で、swtiching(またはロードするか、何を呼び出すか)を調整します。このコードはすべてeclipeやintelliJで動作し、完璧に動作しますが、コンパイルされたアプリケーションでは何もしません!

これはコードです。まずutilパッケージにあるUILoader.javaという名前のutilクラスがあります。その目的は、ステージを完全に切り替えるか、2つの異なるメソッドを使用して既存のステージにウィンドウを追加することです、のSwitchViewとaddWindow:次に、このクラスはビューを切り替えたり、ウィンドウを追加するために、多くのFXMLコントローラで呼び出され

package GodSoft.ing.icdta.CarLoan.util; 

import java.io.IOException; 

import javafx.event.ActionEvent; 
import javafx.fxml.FXMLLoader; 
import javafx.scene.Node; 
import javafx.scene.Parent; 
import javafx.scene.Scene; 
import javafx.scene.image.Image; 
import javafx.stage.Modality; 
import javafx.stage.Stage; 
import javafx.stage.StageStyle; 

public class UILoader { 
    /** 
    * this method adds a new window in modality mode 
    * @param event 
    * @param fxmlURL 
    * @param windowTitle 
    */ 
    public void addWindow(ActionEvent event, String fxmlURL, String windowTitle){ 
     Stage modalityStage = new Stage(); 
     modalityStage.setTitle(windowTitle); 
     modalityStage.setResizable(false); 

     System.out.println("newXMLParent -> " + fxmlURL); 
     Parent newXMLParent = null; 
     try { 
      newXMLParent = FXMLLoader.load(getClass().getResource("../"+fxmlURL)) ; 

     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     Scene newXMLScene = new Scene(newXMLParent); 
     Image image = new Image(getClass().getResource("../img/corner.png").toExternalForm()); 
     modalityStage.setScene(newXMLScene); 
     modalityStage.initModality(Modality.WINDOW_MODAL); 
     modalityStage.initStyle(StageStyle.UNIFIED); 
     modalityStage.initOwner(((Node) event.getSource()).getScene().getWindow()); 
     modalityStage.getIcons().setAll(image ); 
     modalityStage.show(); 
    } 

    /** 
    * This method provides the switch between scenes 
    * @param event 
    * @param fxmlURL 
    * @param windowTitle 
    */ 
    public void switchView(ActionEvent event, String fxmlURL, String windowTitle){ 
     Parent newXMLParent = null; 
     try { 
      newXMLParent = FXMLLoader.load(getClass().getResource("../"+fxmlURL)); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     Scene newXMLScene = new Scene(newXMLParent); 
     Stage stage = (Stage) ((Node) event.getSource()).getScene().getWindow(); 
     stage.setScene(newXMLScene); 
     stage.setTitle(windowTitle); 
     stage.setResizable(false); 
     stage.show(); 
    } 
} 

、これは両方の例である:

これは戻って行くために使用されるビューを(スイッチ「父」ビュー):

これは、ウィンドウを追加するために使用されるが

void CarLoginDoInfo(ActionEvent event) { 
    UILoader switcher = new UILoader(); 
    switcher.addWindow(event, "fxml/Info.fxml", "About Car Loan"); 
} 

あなたがコードを見ることができるようには本当に簡単です。

アプリがどのように構成されているかについての詳細は、main.javaクラスを見つけることができるCarLoanと呼ばれるメインパッケージと、fxml子パッケージに含まれるすべてのfxml、 daoパッケージ、コントローラパッケージ内のコントローラなどがあります。

newXMLParent = FXMLLoader.load(getClass().getResource("../"+fxmlURL)) ; 

あなたは私が最初のパッケージを出て行くと、その後で戻ってきて見ることができるように、私はので、これを書くために必要な:私はUILoaderクラスでこの行を強調したい

は、その2つの方法にduplicaded私がUILoaderクラスをutilパッケージに移動したとき、fxmlリソースが見つからないというnullポインタ例外が発生しました。 :私はそれが動作コンパイルされたアプリケーションを起動すると

newXMLParent = FXMLLoader.load(getClass().getResource("../fxml/mainWindow.fxml") ; 

(私が意味するそのロジックは、私は確信しています)が、インタフェースローダは全くありません!たとえば、最初のインターフェイスに情報ボタンがあり、それをクリックすると、情報ポップアップウィンドウが表示されますが、何もしません。正しいログインデータを挿入すると、ログインして別のビューを読み込む必要がありますが、何もしません!そして、コントローラへのロジックがうまくいくと確信しています...私は本当に何をすべきか分からず、何時間もWebを検索しましたが、この問題については全く何も見つかりませんでした。誰かが私を助けてくれることを願っています...

IntelliJで使用される設定が必要な場合は、プロジェクトツリーにeclipse .xmlファイルさえあるのでコピーするファイルを教えてください...基本的には標準のjavaFXアプリケーション設定ですintelliJのintelliJはexeをコンパイルするときにintelliJにバグがあり、exeをコンパイルしてすべての設定をビルドする必要があることがわかりました。これが私のやり方です。私は主なクラスを見つけて、プログラムを動作させるために必要な外部ライブラリ(mysqlコネクタ)をリンクしました。私は(私はJDKに問題があったコンソールメッセージでプログラムを起動することができました:

は私がUPDATE JDK1.8

This is my Project tree

を働いているあなたの忍耐

ありがとうございましたパスが何らかの理由で失敗した場合)、fxmlが要求されたときに得られるものは、 "ヌルポインタ例外:場所が必要です"です。

しかし、私はまだ理由を理解していない...

UPDATE:

私は、組み合わせるすべての可能な解決策を試してみました "../"、 "/" と単純にFXMLのURL。私も、私は、

File f = new File(fxmlURL); 
String filePath = f.getAbsolutePath(); 
... 
newXMLParent = FXMLLoader.load(getClass().getResource(filePath)) ; 

何も働いていない...私はコンパイル済みのjarファイルをチェックし、それは同じ木がFXMLファイルがジャーにFXMLフォルダに配置されて、私のプロジェクトの画面に掲載している使用してみました考えがなくなった

+0

実行時にfxmlファイルが見つからないため、 'Location is required 'の問題があるようです。それらがターゲットディレクトリにコピーされていることを確認できますか? – ItachiUchiha

+0

@ItachiUchihaご返信ありがとうございます。はい、場所所要メッセージがfxmlソースに関連していることに言及することは忘れてしまいます。とにかく、私のターゲット - > fxmlフォルダ/パッケージにfxmlファイルが存在し、最初にfxmlがプログラムにロードされます!そのファイルはそこにあります... UILoader.javaクラスの "../"を削除して再度コンパイルしようとします UPDATE:UILoaderクラスの "../"を削除すると、正確なエラー。助けて欲しい – Skull47

答えて

0

私は解決策を見つけました。

私はプロジェクトの完全なパスを伝えなければなりませんでした。これはIDEとコンパイルされたバージョンの両方で動作します。

解決策は次のとおりです。

public class UILoader { 
    private String gb = "/GodSoft/ing/icdta/CarLoan/"; 
    ... 
    try { 
     newXMLParent = FXMLLoader.load(getClass().getResource(gb + fxmlURL)) ; 
    ... 
} 

誰もがこのソリューションを強化したい場合は、大歓迎です!

当時の皆様に感謝します。

関連する問題