gpt4 book ai didi

java - JavaFX 的奇怪 Gluon 项目结构 - Android 移植

转载 作者:太空狗 更新时间:2023-10-29 13:18:13 27 4
gpt4 key购买 nike

用于将 JavaFX 移植到 Android 的 Gluon 插件(在 Netbeans 8.0.2 中)的 gradle 构建创建了以下目录结构:

  1. 源包 [Java]
  2. Android/Java 包
  3. 桌面/Java 包
  4. Ios/Java 包

这些目录中的每一个都包含 java 包。通常,Gluon build 会在“Source Packages”目录下的一个 java 包中为我们创建“main”类 [带有“Source Packages”的名称 Packages 可能会产生误导,因为它不是 Java 包,它只是一个文件系统目录]。这个主类扩展了 Javafx Application 类,因此是我们应用程序的入口点。

对于在其中创建的任何 java 包,Android API 只能在 Android/Java Packages 目录中访问。比如说,android.Vibrator 类只能在这里引用。

问题是,我们不能将在 Android/Java 目录中的任何 Java 包中创建的类引用到在 Source Packages [Java] 目录中创建的任何 java 包!!如果是这种情况,那么我们如何将应用程序从 javafx.Application 的 start() 方法推进到 android.Vibrator。

gluon 项目结构的快照位于:How to reference android.jar in Gluon Project

最佳答案

如您所知,JavaFXPorts 项目允许在桌面、Android 和 iOS 设备中部署 JavaFX 应用程序。当它只是纯 JavaFX 代码时,项目将添加到 Main 范围,从那里它将在所有这些平台中可见。

只有在您需要一些平台特定代码的情况下,您才应该将其添加到相应的包中。

正如您所提到的,默认情况下,您不会在主包中看到平台包中添加的代码,因此您必须为此提供一种方法。

如果您检查 HelloPlatform sample在 JavaFXPorts 存储库中,您会找到一个 PlatformService 类,用于使用 ServiceLoader 加载包。

另一种可能性是使用 Class.forName() 在运行时动态加载类,一旦我们知道应用运行的平台。

我建议你看看 Gluon Down项目,为您管理多个特定于平台的服务,并为您提供统一的、独立于平台的 API。

对于 Down 中尚不可用的那些服务(请随意贡献),您可以像在这个使用 Gluon 创建的简单应用程序中一样实现它们 Plugin .

源包 [Java]

首先,创建一个getPlatform() 方法,并将引用的类添加到每个特定平台。例如,在Android包中添加org.gluonoss.vibrator.GluonAndroidPlatform.java

public class GluonPlatformFactory {

public static GluonPlatform getPlatform() {
try {
String platform = System.getProperty("javafx.platform", "desktop");
String path = "org.gluonoss.vibrator.GluonDesktopPlatform";
if(platform.equals("android")) {
path = "org.gluonoss.vibrator.GluonAndroidPlatform";
} else if(platform.equals("ios")) {
path = "org.gluonoss.vibrator.GluonIosPlatform";
}
return (GluonPlatform) Class.forName(path).newInstance();
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException e) {
System.out.println("Platform Error "+e.getMessage());
}
return null;
}
}

现在,使用您在所有平台上所需的方法创建一个界面:

public interface GluonPlatform {

void vibrate();

}

最后,在您的主类上检索平台并调用您的方法:

    @Override
public void start(Stage stage) {
final Button button = new Button("Click me!");

button.setOnAction(e-> GluonPlatformFactory.getPlatform().vibrate());

StackPane root = new StackPane(button);

Rectangle2D visualBounds = Screen.getPrimary().getVisualBounds();
Scene scene = new Scene(root, visualBounds.getWidth(), visualBounds.getHeight());

stage.setScene(scene);
stage.show();
}

桌面/Java 包

添加振动方法。现在将其留空,但您可以添加 Timeline 来移动按钮,例如。

 public class GluonDesktopPlatform implements GluonPlatform {

@Override
public void vibrate() {
System.out.println("Vibrating!");
}

}

Android/Java 包

添加振动方法。请注意,我们必须使用 FXActivity,它是 JavaFX 线程和 Android Activity 之间的桥梁。

public class GluonAndroidPlatform implements GluonPlatform {

@Override
public void vibrate() {
Vibrator v = (Vibrator) FXActivity.getInstance().getSystemService(Context.VIBRATOR_SERVICE);
v.vibrate(500);
}

}

不要忘记在您的 AndroidManifest 文件中添加所需的权限(您可以在 src/android/AndroidManifest.xml 下找到它。

现在您可以部署项目并在桌面上运行它(gradlew run),它会工作,并在 Android 上安装它(gradlew androidInstall),它会也工作。

关于java - JavaFX 的奇怪 Gluon 项目结构 - Android 移植,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32287789/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com