我好久没写了。我们直接谈谈这一点。
我写的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
更新:我能够通过控制台消息启动程序(因为某些原因搞砸了jdk路径问题),当我请求fxml时我得到的是“空指针异常:需要位置”。 / p>
但我仍然不明白为什么......
更新:
我尝试了将“../”,“/”和简单的fxml网址组合在一起的所有可能的解决方案。我甚至尝试使用
File f = new File(fxmlURL);
String filePath = f.getAbsolutePath();
...
newXMLParent = FXMLLoader.load( getClass().getResource( filePath ) ) ;
没有任何效果......我检查了编译的jar,它在我的项目的屏幕上发布了相同的树,fxml文件位于jar的fxml文件夹中,我用完了想法
答案 0 :(得分:0)
感谢朋友,我找到了解决方案。
我必须提供项目的绝对完整路径,它现在可以在我的应用程序的ide和编译版本中工作。
解决方案如下:
public class UILoader {
private String gb = "/GodSoft/ing/icdta/CarLoan/";
...
try {
newXMLParent = FXMLLoader.load( getClass().getResource( gb + fxmlURL ) ) ;
...
}
如果有人想要增强此解决方案,欢迎!
感谢大家的时间!