[英]My executable jar doesn't work
我在“ eclipse”中使用javafx的项目中整夜都在工作。 它运行得非常好,所以我按下了“导出以获取可运行的jar文件,当我得到它时,它只是无法正常工作,仍然无法正常工作。我想问题出在主要方法中,我将在此处发布它。任何帮助会很棒。
package recetas;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.prefs.Preferences;
import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.scene.control.Alert;
import javafx.scene.control.Alert.AlertType;
import javafx.scene.image.Image;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.HBox;
import javafx.stage.Modality;
import javafx.stage.Stage;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import recetas.model.Receta;
import recetas.model.RecetasListWrapper;
import recetas.view.Controlador;
import recetas.view.ControladorEditar;
import recetas.view.VerControlador;
public class MainRecetas extends Application {
private Stage primaryStage;
private ObservableList<Receta> recetaData = FXCollections
.observableArrayList();
public MainRecetas() {
recetaData.add(new Receta("Arroz tres delicias"));
recetaData.add(new Receta("Pollo al horno"));
recetaData.add(new Receta("Bizcocho de chocolate"));
recetaData.add(new Receta("Pizza barbacoa"));
recetaData.add(new Receta("Sopa de pescado"));
recetaData.add(new Receta("Macarrones a la bolognesa"));
recetaData.add(new Receta("Pechuga con patatas fritas"));
recetaData.add(new Receta("Macedonia"));
recetaData.add(new Receta("Fresas con chocolate"));
recetaData.get(1).setVal(1);
recetaData.get(1).setPlato("Plato");
recetaData.get(1).setDif("Facil");
recetaData.get(2).setDif("Dificil");
}
public ObservableList<HBox> getCajasList() {
ObservableList<HBox> res = FXCollections.observableArrayList();
for (int i = 0; i < recetaData.size(); i++)
res.add(recetaData.get(i).getCaja());
return res;
}
@Override
public void start(Stage primaryStage) {
this.primaryStage = primaryStage;
this.primaryStage.setTitle("Mis recetillas");
this.primaryStage.getIcons().add(new Image("@../../icono.png"));
showPersonOverview();
}
public void showPersonOverview() {
Controlador controller = null;
try {
FXMLLoader loader = new FXMLLoader();
loader.setLocation(MainRecetas.class.getResource("view/Vista.fxml"));
AnchorPane personOverview = (AnchorPane) loader.load();
Scene scene = new Scene(personOverview);
primaryStage.setScene(scene);
controller = loader.getController();
controller.setMainRecetas(this);
primaryStage.show();
} catch (IOException e) {
e.printStackTrace();
}
File file = getFilePath();
if (file != null){
CargarRecetas(file);
controller.setMainRecetas(this);
}
}
public boolean editar(Receta r) {
try {
FXMLLoader loader = new FXMLLoader();
loader.setLocation(MainRecetas.class
.getResource("view/VentanaEditar.fxml"));
AnchorPane editar = (AnchorPane) loader.load();
Stage dialog = new Stage();
dialog.setTitle("Editar receta: " + r.getNombre());
dialog.initModality(Modality.WINDOW_MODAL);
dialog.initOwner(primaryStage);
Scene scene = new Scene(editar);
dialog.setScene(scene);
ControladorEditar controller = loader.getController();
controller.setDialogStage(dialog);
controller.setReceta(r);
dialog.showAndWait();
return controller.getOK();
} catch (IOException e) {
e.printStackTrace();
return false;
}
}
public boolean nuevo() {
try {
FXMLLoader loader = new FXMLLoader();
loader.setLocation(MainRecetas.class
.getResource("view/VentanaEditar.fxml"));
AnchorPane editar = (AnchorPane) loader.load();
Stage dialog = new Stage();
Receta r = new Receta(null);
dialog.setTitle("Nueva receta");
dialog.initModality(Modality.WINDOW_MODAL);
dialog.initOwner(primaryStage);
Scene scene = new Scene(editar);
dialog.setScene(scene);
ControladorEditar controller = loader.getController();
controller.setDialogStage(dialog);
controller.setReceta(r);
dialog.showAndWait();
boolean ok = controller.getOK();
if (ok)
recetaData.add(0, r);
return ok;
} catch (IOException e) {
e.printStackTrace();
return false;
}
}
public void ver(Receta r) {
try {
FXMLLoader loader = new FXMLLoader();
loader.setLocation(MainRecetas.class
.getResource("view/VerReceta.fxml"));
AnchorPane editar = (AnchorPane) loader.load();
Stage dialog = new Stage();
dialog.setTitle(r.getNombre());
dialog.initModality(Modality.WINDOW_MODAL);
dialog.initOwner(primaryStage);
Scene scene = new Scene(editar);
dialog.setScene(scene);
VerControlador controller = loader.getController();
controller.setReceta(r);
dialog.showAndWait();
} catch (IOException e) {
e.printStackTrace();
}
}
public void ayuda() {
try {
FXMLLoader loader = new FXMLLoader();
loader.setLocation(MainRecetas.class
.getResource("view/Ayuda.fxml"));
AnchorPane editar = (AnchorPane) loader.load();
Stage dialog = new Stage();
dialog.setTitle("Ayuda");
dialog.initModality(Modality.WINDOW_MODAL);
dialog.initOwner(primaryStage);
Scene scene = new Scene(editar);
dialog.setScene(scene);
dialog.showAndWait();
} catch (IOException e) {
e.printStackTrace();
}
}
public Stage getPrimaryStage() {
return primaryStage;
}
public ObservableList<Receta> getRecetaData() {
return recetaData;
}
public void eliminar(int i) {
recetaData.remove(i);
}
public void setFilePath(File file) {
Preferences prefs = Preferences.userNodeForPackage(MainRecetas.class);
if (file != null) {
prefs.put("filePath", file.getPath());
primaryStage.setTitle("Mis recetillas - " + file.getName());
} else {
prefs.remove("filePath");
primaryStage.setTitle("Mis recetillas");
}
}
public File getFilePath() {
Preferences prefs = Preferences.userNodeForPackage(MainRecetas.class);
String filePath = prefs.get("filePath", null);
if (filePath != null) {
return new File(filePath);
} else {
return null;
}
}
public void CargarRecetas(File file) {
try {
JAXBContext context = JAXBContext
.newInstance(RecetasListWrapper.class);
Unmarshaller um = context.createUnmarshaller();
RecetasListWrapper wrapper = (RecetasListWrapper) um
.unmarshal(file);
recetaData.clear();
try{ recetaData.addAll(wrapper.getRecetas());}
catch(NullPointerException e){}
setFilePath(file);
} catch (JAXBException e) {
Alert alert = new Alert(AlertType.ERROR);
alert.setTitle("Error");
alert.setHeaderText("No se pudo cargar la información del archivo:\n"
+ file.getPath());
alert.showAndWait();
}
}
public void guardarRecetas(File file) {
try {
JAXBContext context = JAXBContext
.newInstance(RecetasListWrapper.class);
Marshaller m = context.createMarshaller();
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
RecetasListWrapper wrapper = new RecetasListWrapper();
wrapper.setRecetas(recetaData);
m.marshal(wrapper, file);
setFilePath(file);
} catch (Exception e) {
Alert alert = new Alert(AlertType.ERROR);
alert.setTitle("Error");
alert.setHeaderText("No se pudo guardar la información en el archivo:\n"
+ file.getPath());
alert.showAndWait();
}
}
public List<Receta> buscarDestacadas() {
List<Receta> l = new ArrayList<Receta>();
for (int i = 0; i < recetaData.size(); i++) {
Receta r = recetaData.get(i);
if (r.getVal() == 5)
l.add(r);
}
return l;
}
public static void main(String[] args) {
launch(args);
}
}
由于注释中描述的事件以及您提供的代码,我有两种可能的解决方案。
launch()
方法。 这意味着一旦启动,该程序将无处可去,并且应该会产生错误,因为没有方法launch()
。 jar file
而不是runnable jar file
。 如果这样做,您要做的就是更改导出方式。 我也遇到了同样的问题,但是我在start方法中初始化了照片(仅在JavaFX中使用),并且我的问题已解决,并且jar与在IDE中工作相同(在我的情况下为Eclipse)。
@Override
public void start(Stage stage) {
// set all photos in this function
}
在Eclipse IDE中注意:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.