【发布时间】:2015-06-28 00:40:26
【问题描述】:
我在“eclipse”中使用 javafx 的项目中工作了一整夜。它工作得很好,所以我按下“导出来获取可运行的 jar 文件,当我得到它时,它只是没有工作,仍然没有。我想问题出在 main 方法中,我将在这里发布。任何帮助会很棒。
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);
}
}
【问题讨论】:
-
by
doesn't work,你的意思是它崩溃了吗?你得到什么样的错误? -
从命令行运行它并发布堆栈跟踪
-
我双击它,它就是不运行。它不会给出任何错误,就像我没有点击一样。
-
而且在命令行中也没有报错
-
..在 jar 中不起作用,@符号也不起作用(我什至不知道 @ 应该是什么意思),所以删除@../../icono.png,将图标放入jar 文件的根目录并通过/icono.png引用它。还要确保它们引用的 fxml 文件和资源位于正确的位置。如果您仍然有问题,只需尝试将基本的 hello world 应用程序打包为 jar,然后逐渐从您的程序中一次添加一个功能,直到它中断 - 这样您就会更好地了解什么错误是。同时运行java -jar yourapp.jar。
标签: java eclipse javafx export executable-jar