java - 代码在 ide 上工作,但在从 .jar 运行时不工作

标签 java user-interface jar ide tess4j

制作这个小程序来测试一些 GUI 和 Tess4j。

public static void main(String[] args) {

    JButton open = new JButton();
    JFileChooser fc = new JFileChooser();
    fc.setCurrentDirectory(new java.io.File("C:"));
    fc.setDialogTitle("Classificador de Documentos");
    if (fc.showOpenDialog(open) == JFileChooser.APPROVE_OPTION){

    }
    JFrame wait = new JFrame("Resultado");
    wait.setVisible(true);
    wait.setSize(300, 300);
    JLabel labelwait = new JLabel("Loading");
    JPanel panelwait = new JPanel();
    wait.add(panelwait);
    panelwait.add(labelwait);

    File imageFile = new File(fc.getSelectedFile().getAbsolutePath());
    ITesseract instance = new Tesseract();
    instance.setLanguage("por");// JNA Interface Mapping
    // ITesseract instance = new Tesseract1(); // JNA Direct Mapping

    try {
        String result = instance.doOCR(imageFile);

        if (result.toLowerCase().contains("ecocardiograma")){
            JFrame frame = new JFrame("Resultado");
            frame.setVisible(true);
            frame.setSize(300, 300);
            JLabel label = new JLabel("Este ficheiro é um ecocardiograma");
            JPanel panel = new JPanel();
            frame.add(panel);
            panel.add(label);
        }
        else {
            JFrame frame = new JFrame("Resultado");
            frame.setVisible(true);
            frame.setSize(300, 300);
            JLabel label = new JLabel("Este ficheiro não é um ecocardiograma");
            JPanel panel = new JPanel();
            frame.add(panel);
            panel.add(label);
        }
    } catch (TesseractException e) {
        JFrame frame = new JFrame("Resultado");
        frame.setVisible(true);
        frame.setSize(300, 300);
        JLabel label = new JLabel(e.getMessage());
        JPanel panel = new JPanel();
        frame.add(panel);
        panel.add(label);
    }
}

在 Eclipse IDE 上运行此代码时,它按预期工作,但在 .jar 文件上运行时,它卡在标记为“正在加载”的第二帧上

可能是什么问题?

最佳答案

如果你使用Swing解决方案是:

把你的代码放在一个线程安全的地方

java.awt.EventQueue.invokeLater(new Runnable() {
        public void run() {
            // your main code ...
        }
    });

示例:

java.awt.EventQueue.invokeLater(new Runnable() {
        public void run() {
           JFrame wait = new JFrame("Resultado");
           wait.setVisible(true);
           wait.setSize(300, 300);
           JLabel labelwait = new JLabel("Loading");
           JPanel panelwait = new JPanel();
           wait.add(panelwait);
           panelwait.add(labelwait);
        }
    });

如果你使用 JavaFx 解决方案是:

Platform.runLater(() -> {
        //your main code her ...
});

示例:

Platform.runLater(() -> {
        JFrame wait = new JFrame("Resultado");
        wait.setVisible(true);
        wait.setSize(300, 300);
        JLabel labelwait = new JLabel("Loading");
        JPanel panelwait = new JPanel();
        wait.add(panelwait);
        panelwait.add(labelwait);
});

关于java - 代码在 ide 上工作,但在从 .jar 运行时不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49371405/

相关文章:

java - 确定表单上项目的索引 (J2ME)

ios 程序化 UI 与自动布局最佳实践

jar - Gradle 实现 vs 在 jar 任务中编译

java - 将包含 Log4j2 的项目导出到 JAR 时出错

java - Log4j 记录器的生命周期及其使用的资源

运行 junit 测试用例时,使用 org.json.JSONTokener 进行架构验证失败时出现 java.lang.NoSuchMethodError

java - 从屏幕顶部到底部的布局

使用带有窗口菜单元素的 pyGame 的 Python 游戏

c# - 如何在新线程中调用长方法以保持 UI 在 C# 中运行

java - 从插件目录将 jar 添加到 Docker 镜像