2015-10-14 81 views
3

我们正在开发具有图形布局组件的java桌面/ Eclipse RCP应用程序。我们遇到了Windows上新版本(8,8.1,10)版本的GUI缩放问题,它似乎只能通过win32 api调用来检索缩放因子,所以我们添加了一个小DLL并通过JNI调用它。在windows上工作得很好,在linux/osx的maven中工作良好,因为类从未在那里实例化。Eclipse中的平台特定代码

的问题是,得到的缩放因子,我们需要的窗口句柄,我们取得这样的:

public float getScale(GC gc) { 
    return getScale(gc.getGCData().hwnd); 
} 

其中GCorg.eclipse.swt.graphics.GC与以下调用的dll。但是,在Linux上进行调试时,该行给我一个编译错误,因为该对象没有hwnd变量。如何在没有编译错误的情况下以更清晰的方式解决此问题?

+0

这是一个Eclipse RCP应用程序(它具有这种机制)或只是一个SWT应用程序? –

+0

补充说明,这是一个eclipse rcp应用程序。什么机制?我环顾了一下,但找不到任何东西。 – dutt

+0

您可以将“插件片段”与平台过滤器一起使用,以便仅在所选平台上使用它。 –

回答

2

您可以使用插件片段,因为Greg已经获得。一个片段可以有一个platform filter,当当前平台不符合过滤器表达式时,该片段将阻止其加载。

为32位WINDWS的平台过滤器应该是这样的:

Eclipse-PlatformFilter: (& (osgi.ws=win32) (osgi.os=win32) (osgi.arch=x86)) 

片段还必须指定主机捆绑。在运行时,片段资源合并到宿主束

Fragment-Host: the.parent.bundle 

的类空间,以避免编译错误,你会在你的主机捆绑的接口或抽象类,并适用于Windows不同的实现两个片段和Linux。

Windows实现可以安全地访问hwnd字段,并且Linux实现可以返回一个值,指示缩放不可用/修复。

例如,主机束将具有ScaleProvider

class abstract ScaleProvider { 

    ScaleProvider getInstance() { 
    String className = ScaleProvider.class + "Impl"; 
    try { 
     Class<?> implClass = ScaleProvider.class.getClassLoader().loadClass(className); 
     return (ScaleProvider)implClass.newInstance(); 
    } catch(ClassNotFoundException | InstantiationException | IllegalAccessException e) { 
     throw new RuntimeException(e); 
    } 
    } 

    abstract float getScale(Gc gc); 
} 

为简洁起见,实施装载机接口描述是在一种类型。 getInstance()代码预计名为ScaleProviderImpl的类将出现在同一个包中。

ScaleProviderImpl类由匹配当前平台和将具有类

class ScaleProviderImpl extends ScaleProvider { 
    float getScale(Gc gc) { 
    // platform-specific implementation 
    } 
} 

本示例假定总有一个匹配的平台特定片段存在于片段中。但是,如果没有找到ScaleProviderImpl,您当然可以更改getInstance()代码以返回默认实现。