2015-10-14 77 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()代碼以返回默認實現。