【问题标题】:How to call the Java file from another Java file [duplicate]如何从另一个Java文件调用Java文件[重复]
【发布时间】:2016-09-30 15:48:38
【问题描述】:

我在调用从另一个包含 UI 元素的 Java 文件创建的 Java 文件时遇到了困难。这是我试图调用的 Java 代码:

public class XzibitVideo extends Application{

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

    @Override
    public void start(Stage stage) {
        String path = "Data/Video/Clip.flv";
        Media media = new Media(new File(path).toURI().toString());

        MediaPlayer mediaPlayer = new MediaPlayer(media);
        MediaView mediaView = new MediaView(mediaPlayer);

        BorderPane borderPane = new BorderPane();
        borderPane.setCenter(mediaView);
        //borderPane.setStyle("-fx-background-color: Black");
        //borderPane.setBottom(addToolBar());

        Scene scene = new Scene(borderPane, 1024, 800);
        scene.setFill(javafx.scene.paint.Color.BLACK);

        stage.setTitle("Media Player");
        stage.setScene(scene);
        stage.show();

        mediaPlayer.setAutoPlay(true);
        mediaPlayer.setOnError(()->System.out.println("media error"+ mediaPlayer.getError().toString()));
    }
}

我尝试了几种方法来调用它,但恐怕它们都不起作用。例如,

XzibitVideo programVideo = new XzibitVideo();
programVideo.start();

XzibitVideo programVideo = new XzibitVideo();
programVideo.run();

XzibitVideo programVideo = new XzibitVideo();
programVideo.main();

*我也尝试过添加参数/参数,但没有成功:

XzibitVideo programVideo = new XzibitVideo();
programVideo.start(Stage stage);

如果有人知道如何正确调用此函数,我将不胜感激!我在这部分工作太久了,我失去了所有希望.. :(

【问题讨论】:

  • programVideo.start() - 但是你的 start(Stage stage) 方法需要 1 个参数 - 阶段,所以你可能从超类调用 start() 方法,也许超类中的方法什么都不做
  • programVideo.start(舞台舞台); - 这是一个错误。你应该在这里传递一个参数:例如Stage s = new Stage(); programVideo.start(s);
  • XzibitVideo.main(new String[0]);Application.launch(XzibitVideo.class);
  • 我尝试了您的所有建议,但它们都向我显示此错误“java.lang.IllegalStateException:仅在事件线程上允许此操作”(我相信这是唯一的部分可能有帮助的错误消息)

标签: java javafx launch stage


【解决方案1】:

我认为这应该可行:

    XzibitVideo programVideo = new XzibitVideo();
    programVideo.launch(XzibitVideo.class);
    this.dispose();

【讨论】:

  • 从非静态上下文调用静态方法是不好的做法。
  • 谢谢一百万!!你是最棒的!!这绝对让我的代码工作,感谢所有帮助向我解释这个问题的人!我已经被困在这个部分好几个星期了,几乎放弃了!祝大家有美好的一天!
  • 老实说,如果你需要这样做,你的程序结构不正确。
  • 玩了一会儿之后,这段代码也完成了(我认为它也更快更安全)XzibitVideo.launch(XzibitVideo.class);
【解决方案2】:

CLASSPATH 定义了在哪里寻找类。您可以将 CLASSPATH 设置为环境变量(以某种方式取决于您的操作系统),或者您可以在调用 Java 时为其提供命令行参数。

类文件可以在另一个目录中,也可以在 JAR 中 - 无论如何,您必须使用 CLASSPATH 指向它。

【讨论】:

  • 我不确定我是否理解这里的相关性...问题不在于 ClassPath,因为它与我成功调用的其他 java 文件位于同一个包中,但是我调用了它们通过它们中可用的 .run() 函数。 .. 不幸的是,如您所见,这个 java 文件没有运行功能,而是有一个“启动”功能,我不知道如何调用它:)
  • 所以也许你的问题应该是:“如何从类 XzibitVideo 调用方法,它扩展了 Application”。任何javadoc吗?由于class XzibitVideo 有一个main(),它表明它可以作为外部程序运行。
【解决方案3】:

您可以使用

从另一个类启动应用程序
Application.launch(XzibitVideo.class);

注意:

  1. 此方法将一直阻塞,直到 JavaFX 平台退出
  2. 每个应用程序只能调用一次launch()(即每个 JVM 生命周期一次)

目前还不清楚您为什么要这样做。 Application 子类中的 start() 方法(顾名思义)是应用程序的起点。 main 方法甚至只包含在 JavaFX 应用程序中,以便于无法本地启动 JavaFX 应用程序类的运行时环境。因此,Application 子类本质上是不可重用的。如果您希望XzibitVideo 可重用,您应该重构它,使其不是Application 的子类,并创建一个简单的Application 子类,其start() 方法引用它。

【讨论】:

  • 非常感谢詹姆斯,我可能需要做更多的研究。我不喜欢不知道事情,尤其是当我的程序的重要部分正在使用它时。另外,我试过Application.launch(XzibitVideo.class);,效果也很好:) 非常感谢你的帮助,我会继续研究和试验,希望我能对此有更好的理解。
【解决方案4】:

试试:

Stage stage = new Stage(); // or using another constructor of class Stage
XzibitVideo programVideo = new XzibitVideo();
programVideo.start(stage);

【讨论】:

  • 我已经添加了构造函数,就像您在此处介绍的那样。但是我现在调用它时遇到错误...“java.lang.IllegalStateException:在事件线程上允许此操作only" 我相信这是错误消息中唯一可能有帮助的部分
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-24
  • 1970-01-01
  • 1970-01-01
  • 2012-10-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多