当前位置: 首页 > 知识库问答 >
问题:

扩展应用程序的扩展引发InvocationTargetException

东方嘉佑
2023-03-14

我正在做一个项目,该项目将有许多JavaFX应用程序,这些应用程序具有相似但又足够不同的功能,因此我创建了一个抽象基类来扩展Application以处理常见的功能并指示它们需要做什么,还创建了一系列具体的类来扩展这些功能。然而,当我试图跑的时候,我得到

应用程序构造函数java.lang.Reflect.InvocationTargetException位于java.base/jdk.internal.reflect.NativeMethodAccessorImpl.Invoke0(原生方法)位于java.base/jdk.internal.reflect.NativeMethodAccessorImpl.Invoke(nativeMethodAccessorImpl.java:62)位于.base/sun.launcher.launcherHelper$fxhelper.main(launcherHelper.java:941)原因:java.lang.RuntimeException:无法构造应用程序实例:class toolbase.tool在javafx.graphics/com.sun.javafx.Application.launcherimpl.launchapplication1(launcherimpl.java:963)在javafx.graphics/com.sun.javafx.Application.launcherimpl.lambda$launchapplicationmimpl.java:418)在java.base/java.security.accessController.doprivileged(本机方法)在javafx.graphics/com.sun.javafx.application.platformimpl.lambda$runlater$10(Platformimpl.java:417)在javafx.graphics/com.sun.glass.ui.invokelaterdispatcher$future.run(invokelaterdispatcher.java:96)在

这是基类的要旨:

public abstract class Tool extends Application {
public CCS ccs;
public abstract String getLongName();
public abstract String getShortName();
public abstract String getVersion();

public void start(Stage primaryStage) {
    try {
        primaryStage.setTitle("[Company] " + getLongName() + " v" + getVersion());
        Scene scene = new Scene(build(primaryStage), 200, 100);
        primaryStage.setScene(scene);
        primaryStage.show();
    } catch (Exception e) {
        e.printStackTrace();
    }
}
public abstract Parent build(Stage stage);

public static void main(String[] args) {
    launch(args);
}

@Override public void stop() { ccs.openTools.remove(getLongName()); }
}  

现在所有的扩展都如下所示:

public class ACT extends Tool {
public String getLongName() {return "[Tool name]"; }
public String getShortName() {return "ACT"; }
public String getVersion() {return "α.0";}

public Parent build(Stage stage) {
    BorderPane root = new BorderPane();

    Button b = new Button("Do "+getShortName()+" stuff");
    b.setOnMouseClicked((e) -> {
        System.out.println(getShortName()+" stuff");
    });
    root.setCenter(b);
    return root;
}
}

所有的依赖和一切都很好。当我让它们扩展应用程序并从基类复制公共功能时,它们运行得很好。有人知道这是怎么回事吗?

共有1个答案

单于旭东
2023-03-14

在基类中不应该有public static void main(string[]args)。每个扩展类都需要包含该方法自己的副本。

在基类中这样做会导致JavaFX尝试启动tool类的副本,这显然是行不通的,因为它是抽象的。

 类似资料:
  • Flarum 是简约的,同时也是高度可扩展的。实际上,Flarum 附带的大部分功能都是扩展程序。 这种方法使得 Flarum 具有极高的可定制性。您可以禁用任何您不需要的功能,并安装其他扩展,打造更适合您的社区。 如果您想了解更多关于 Flarum 的理念,我们在核心中包含了哪些功能,或者您想制作自己的扩展,请查看我们的 扩展文档。 本文将重点讨论从论坛管理员的角度管理扩展。 Flarum 有一

  • Node.js以单线程模式运行,但它使用事件驱动的范例来处理并发。 它还有助于创建子进程,以便在基于多核CPU的系统上利用并行处理。 子进程总是有三个流child.stdin , child.stdout和child.stderr ,它们可以与父进程的stdio流共享。 Node提供了child_process模块,该模块具有以下三种创建子进程的主要方法。 exec - child_process

  • 目的 使用部署配置来部署多个 Pod,并以此扩展缩放应用。 环境 openshift v3.11.16/kubernetes v1.11.0 步骤 创建工程1. CLI 登录到 OCP $ oc login https://master.example.com:8443 -u admin -p admin2. 创建工程 $ oc new-project lab08 创建一个新应用,测试缩放1. 创

  • Electron支持Chrome DevTools 扩展程序,可增强开发工具调试流行web框架的能力 DevTools Extension Electron supports the Chrome DevTools Extension, which can be used to extend the ability of devtools for debugging popular web fra

  • 我们已经完成了所有创建网站的各项不同必须的步骤:我们知道如何写一个模型,url,视图和模板。我们同样知道如何让我们网站更漂亮。 现在来练习吧! 我们网站里的第一件事情就是,一个展现一篇博客的页面,对吗? 我们已经有了Post模型,所以我们不需要再添加任何内容到models.py文件中。. 创建一个模板链接,跳转到博文的内容页 我们将从在blog/templates/blog/post_list.h

  • 阅读《入门指南》和《概述》后,可以将该指南用作扩展组件和功能的概述。鼓励开发人员探索和扩展功能。 自定义扩展用户界面 Browser Actions 将图标,工具提示,徽章和弹出窗口添加到工具栏。 Commands 添加触发操作的键盘快捷键。 Context Menus 将 item 添加到 Google Chrome的上下文菜单。 Omnibox 将关键字功能添加到地址栏。 Override P