Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/180.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于JavaFX-Android移植的奇怪glion项目结构_Java_Android_Javafx_Netbeans 8_Javafxports - Fatal编程技术网

用于JavaFX-Android移植的奇怪glion项目结构

用于JavaFX-Android移植的奇怪glion项目结构,java,android,javafx,netbeans-8,javafxports,Java,Android,Javafx,Netbeans 8,Javafxports,用于将JavaFX移植到Android的Gluon插件(在Netbeans 8.0.2中)的gradle构建创建了以下目录结构: 源程序包[Java] Android/Java软件包 桌面/Java软件包 Ios/Java软件包 每个目录中都包含java包。一般来说,Gluon build会在“Source Packages”目录下的一个java包中为我们创建“main”类[带有“Source Packages”的名称Packages可能会引起误解,因为它不是一个java包,只是一个文件系统目录

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

  • 源程序包[Java]
  • Android/Java软件包
  • 桌面/Java软件包
  • Ios/Java软件包
  • 每个目录中都包含java包。一般来说,Gluon build会在“Source Packages”目录下的一个java包中为我们创建“main”类[带有“Source Packages”的名称Packages可能会引起误解,因为它不是一个java包,只是一个文件系统目录]。这个主类扩展了Javafx应用程序类,因此是我们应用程序的入口点

    Android API只能在Android/Java Packages目录中访问,其中创建的任何Java包都可以访问。比如说,android.可控震源类只能在这里引用

    问题是,我们不能将Android/Java目录中任何Java包中创建的类引用到源程序包[Java]目录中创建的任何Java包!!如果是这种情况,那么我们如何将应用程序从javafx.application的start()方法向前推进到android.可控震源


    gluon项目结构的快照位于:

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

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

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

    如果您检查JavaFXPorts存储库上的HelloPlatform,您将找到一个
    PlatformService
    类,使用
    ServiceLoader
    加载包

    另一种可能是在知道应用程序运行的平台后,使用
    Class.forName()
    在运行时动态加载类

    我建议您看看这个项目,它为您管理几个特定于平台的服务,并为您提供统一的、独立于平台的API

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

    源程序包[Java]

    首先,创建一个
    getPlatform()
    方法,并将引用的类添加到每个特定的平台。例如,在Android软件包上添加
    org.gluonoss.可控震源.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软件包

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

     public class GluonDesktopPlatform implements GluonPlatform {
    
        @Override
        public void vibrate() {
            System.out.println("Vibrating!");
        }
    
    }
    
    Android/Java软件包

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

    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

    非常感谢@Jose Pereda。由于java.util.ServiceLoader必须通过META-INF/services目录中的识别文件明确指示服务提供程序的实现,并且此目录结构应该在应用程序的运行时类路径中出现,因此需要对o在gradle构建脚本中创建,以便将运行时类路径设置为指向META-INF/services。我对gradle很陌生,所以任何输入都很好。我认为您不需要任何修改。HelloPlatform示例与ServiceLoader一起工作,而不需要任何更改。无论如何,我更喜欢类。forName()方法,其中类名称插入代码中,因此您不需要额外的文本文件。您是否尝试了可控震源示例'@JosePereda。非常感谢您的帮助和解释。我尝试了上面的代码,效果很好;我使用了Class.forName(String)而不是ServiceLoader。由于您已经在进行Charm Down的工作,并且正如您所说,还有一些服务尚未创建,因此我很乐意为这一点做出贡献,因为我现在对JavaFXPorts有一定程度的信心。从专业角度讲,我将JavaFX for UI与EJB作为服务器组件,采用RMI和JMS fo等标准r集成。我很想与您讨论,我想知道我应该从哪项服务开始。很高兴知道!我们可以将讨论转移到。我建议您看看,因为除了向下,它还包括连接云服务,以及闪烁的UI。Pereda,我已经在以下位置开始了一个线程:请提供您的输入。