我们正在开发一个带有图形布局组件的java桌面/Eclipse应用程序。我们在windows上新版本(8、8.1、10)上遇到了GUI扩展问题,似乎只有通过win32 api调用才能检索缩放因子,所以我们添加了一个小的DLL来完成这个任务,并通过JNI调用它。在windows上工作很好,在linux/osx上的maven中工作得很好,因为该类从未在那里实例化过。
问题是,要获得缩放因子,我们需要窗口句柄,我们检索如下:
public float getScale(GC gc) {
return getScale(gc.getGCData().hwnd);
}
其中GC
是一个org.eclipse.swt.graphics.GC
,下面的调用是对dll的调用。但是,在linux上调试时,这几行会给我一个编译错误,因为该对象没有hwnd
变量。如何在没有编译错误的情况下以更干净的方式解决这个问题?
发布于 2015-10-14 09:16:36
您可以使用插件片段,如格雷格所建议的。一个片段可以有一个平台过滤器,当当前平台与过滤器表达式不匹配时,就无法加载它。
用于Windws 32位的平台过滤器如下所示:
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.getName() + "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
}
}
此示例假设始终存在一个匹配的平台特定片段。但是,如果找不到getInstance()
,当然可以更改ScaleProviderImpl
代码以返回默认实现。
https://stackoverflow.com/questions/33119058
复制相似问题