【问题标题】:JavaFx runnable JAR export is not workingJavaFx 可运行 JAR 导出不起作用
【发布时间】:2015-12-21 07:55:37
【问题描述】:

我使用 JavaFX 制作了一个简单的字典。我在我的应用程序中使用了 SQLite 数据库和一些图片。我使用 e(fx) Eclipse 将应用程序导出为可运行的 JAR 文件。我按照此处描述的步骤进行操作 - https://wiki.eclipse.org/Efxclipse/Tutorials/Tutorial1。

导出后,我打开了 .JAR 文件。它已成功打开,但无法正常工作。它没有显示来自数据库和图像的结果。

当我在构建和导出之前将应用程序运行到 Eclipse 工作区时,它运行良好。

问题出在哪里?我该如何解决?

下面是Controller Class函数的代码:

package imran.jfx.application;

import java.io.File;
import java.net.URL;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ResourceBundle;

import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Label;
import javafx.scene.control.ScrollPane;
import javafx.scene.control.TextArea;
import javafx.scene.control.TextField;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.scene.text.Text;

public class Application_Controler implements Initializable{

    @FXML
    private HBox hBox;

    @FXML
    private Label searchLabel;

    @FXML
    private TextField searchWord;

    @FXML
    private VBox vBox;

    @FXML
    private Text BanglaMeaning;

    @FXML
    private TextArea bnMeaningTxt;

    @FXML
    private Text bAcaMeaning;

    @FXML
    private ScrollPane bAcaMeaningImg;

    @FXML
    private Label footerLabel;

    ResultSet result;
    PreparedStatement doQuery;
    Connection conn;
    String query;

    @Override
    public void initialize(URL location, ResourceBundle resources) {
        try 
        {
            Class.forName("org.sqlite.JDBC");
        } 
        catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        String url="jdbc:sqlite:src/imran/ankurdb/meaning/bn_words.db";
        try 
        {
            conn = DriverManager.getConnection(url);
        } 
        catch (SQLException e) {
            e.printStackTrace();
        }
    }

    @FXML
    void showMeaning(ActionEvent event) throws Exception {
        bnMeaningTxt.clear();

        String text=searchWord.getText();

        query = "select en_word,bn_word from words where en_word='"+text+"'";

        doQuery = conn.prepareStatement(query);
        result = doQuery.executeQuery();

        int i=0;
        while (result.next()) 
        {
            if(i==0)
            {
                bnMeaningTxt.appendText(result.getString(1) + "\t\t" + result.getString(2));
                i++;
            }
            else
                bnMeaningTxt.appendText(" , "+result.getString(2));
        }

        File file = new File("src/imran/bnacademy/meaning/"+text);
        Image image = new Image(file.toURI().toString());
        bAcaMeaningImg.setContent(new ImageView(image));
    }

}

【问题讨论】:

  • 你能添加你用来加载图像的代码吗?
  • 我已经更新了添加代码的帖子。请立即检查。
  • 我猜这些图像存在于您的 jar 中,如果我猜对了,您无法使用 File 加载存在于您的 jar 中的图像。您需要使用类加载器来加载它们。
  • 那么数据库呢?为什么数据库中没有显示信息?
  • 这同样取决于您首先如何创建与数据库的连接。我将开始调试并检查连接是否正确建立;)

标签: java eclipse jar javafx javafx-8


【解决方案1】:

这里有多个问题。

  1. 您正在尝试在项目中创建数据库文件。当您将项目打包为 jar 时,这将不起作用。你应该在你的项目之外给它一个url。数据库文件应始终放在项目之外,这样当您将项目打包为 jar 时,仍然可以创建、读取和写入它们。

  2. 如果图像存在于您的 jar 中,则不能使用 io.File 加载图像。您需要改用class loader 来加载它们。

代码

URL url = getClass().getResource("/imran/bnacademy/meaning/" + text);
Image image = new Image(url.toExternalForm());

【讨论】:

    猜你喜欢
    • 2020-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-18
    • 1970-01-01
    • 2017-05-21
    • 2021-08-14
    相关资源
    最近更新 更多