JavaFX编译了关于切换视图的应用程序问题

时间:2016-05-12 01:36:20

标签: intellij-idea javafx view switch-statement

我好久没写了。我们直接谈谈这一点。

我写的JavaFX应用程序有一个奇怪的问题。我从java开始作为初学者,我的工作已经完成,不需要编译它,但是因为这很重要,所以编程我试了一下。

我使用eclipse和e(fx)clipse开发了我的应用程序,但由于我无法使用eclipse编译它,因此我使用了IntelliJ 2016.1.1(64)来实现此目的。

问题在fxml和显然相关的控制器之间进行了切换(或加载,或任何你想要调用它)。所有这些代码都在eclipe或intelliJ上运行并且工作正常,但是使用已编译的应用程序它根本无效!

这是代码,首先我有一个名为UILoader.java的util类,它可以在util包中找到,它的目的是完全切换舞台或者通过使用2种不同的方法将窗口添加到现有的舞台中, switchView和addWindow:

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();
    }
}

然后在许多fxml控制器中调用此类来切换视图或添加窗口,这是两者的一个示例:

这会切换视图(用于返回“父”视图):

void CloseContractDoGoBack(ActionEvent event) {

    UILoader switcher = new UILoader();
    switcher.switchView(event, "fxml/ContractsHandler.fxml", "Car Loan");
}

虽然这用于添加窗口:

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

正如您所看到的,代码非常简单。

有关如何组织应用程序的更多信息,有一个名为CarLoan的主程序包,您可以在其中找到main.java类,然后是其他一些程序包,所有fxml都包含在fxml子程序包中,dao中的dao包,控制器包中的控制器等。

我想在UILoader类中为这一行加下划线,复制到它的两个方法中:

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

正如你所看到的那样,我首先要打包然后再回来,我需要写这个,因为当我将我的UILoader类移动到util包中时,我得到了关于找不到fxml资源的空指针异常...所以基本上代码变成例如。 :

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

当我启动COMPILED应用程序时,它的工作原理(我的意思是,我确定),但是接口加载器根本没有!例如,第一个界面有一个信息按钮,通过点击它,它应该加载一个关于弹出窗口,但它什么也没做!当我插入正确的登录数据时,它应该登录并加载另一个视图,但它什么都不做!而且我确信控制器的逻辑工作......我真的不知道该怎么做,我在网上搜了好几个小时,我发现这个问题一无所获。希望有人可以帮助我...

如果你需要IntelliJ中使用的配置,只需告诉我要复制哪个文件,因为项目树中甚至有eclipse .xml文件...基本上它是intelliJ的标准javaFX应用程序配置,我发现intelliJ有编译exe时的一个bug,让它编译你需要构建所有配置的exe,这就是我所做的。我找到了主类并链接了使程序工作所需的外部库(mysql连接器),这就是全部!

感谢大家的耐心

我正在研究JDK1.8

This is my Project tree

更新:我能够通过控制台消息启动程序(因为某些原因搞砸了jdk路径问题),当我请求fxml时我得到的是“空指针异常:需要位置”。 / p>

但我仍然不明白为什么......

更新:

我尝试了将“../”,“/”和简单的fxml网址组合在一起的所有可能的解决方案。我甚至尝试使用

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

没有任何效果......我检查了编译的jar,它在我的项目的屏幕上发布了相同的树,fxml文件位于jar的fxml文件夹中,我用完了想法

1 个答案:

答案 0 :(得分:0)

感谢朋友,我找到了解决方案。

我必须提供项目的绝对完整路径,它现在可以在我的应用程序的ide和编译版本中工作。

解决方案如下:

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

如果有人想要增强此解决方案,欢迎!

感谢大家的时间!