如您所知,JavaFXPorts 项目允许在桌面、Android 和 iOS 设备中部署 JavaFX 应用程序。当它只是纯 JavaFX 代码时,项目将添加到主范围中,并且从那里它将在所有这些平台中可见。
仅当您需要某些特定于平台的代码时,才应将其添加到相应的包中。
正如您所提到的,默认情况下,您不会在主包中看到平台包中添加的代码,因此您必须为此提供一种方法。
如果您检查HelloPlatformsample https://bitbucket.org/javafxports/samples在 JavaFXPorts 存储库上,您会发现PlatformService
类来加载包使用ServiceLoader
.
另一种可能性是使用Class.forName()
一旦我们知道应用程序运行的平台,就可以在运行时动态加载类。
我建议你看看胶子下降 http://gluonhq.com/charm-down-available/项目,为您管理多个特定于平台的服务,并为您提供统一的、独立于平台的 API。
对于那些尚未提供的服务Down https://bitbucket.org/gluon-oss/charm-down(随意贡献),您可以像使用 Gluon 创建的这个简单应用程序一样实现它们Plugin http://gluonhq.com/products/tools/.
源码包[Java]
首先,创建一个getPlatform()
方法,并将引用的类添加到每个特定平台。例如,添加org.gluonoss.vibrator.GluonAndroidPlatform.java
在 Android 包上。
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
),它也会起作用。