<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    weidagang2046的專欄

    物格而后知致
    隨筆 - 8, 文章 - 409, 評論 - 101, 引用 - 0
    數據加載中……

    SWT設計思路

    眾所周知,SWTSwing最大的不同就是它直接使用操作系統提供的現成的本地圖形接口,于是具備本地化的Look & Feel。但是它是怎么做到這一點的呢,當然是通過JNI。我們來看一個例子,假定我們使用Win32API

    我們現在有一個文本框text,通過如下的代碼,我們給它一個字符串,并讓它選擇/highlight3~5[3,5])的字符。

    text.setText(“abcdefgh”);
    text.setSelection(
    36);


    Windows下,這個setSelection方法是怎么實現的呢?我們可以看看源碼:

    public void setSelection (int start, int end) {
           …
           OS.SendMessage (handle, OS.EM_SETSEL, start, end);
           OS.SendMessage (handle, OS.EM_SCROLLCARET, 
    00);
    }

    做過Windows編程的朋友可能一下子就認出了這個SendMessage,這不就是Win32 API中用于向窗體發送消息的函數嗎?呵呵,沒錯,我們再來看一下這個SendMessage方法的原型:

    public static final int SendMessage (int hWnd, int Msg, int wParam, int lParam) {
           
    if (IsUnicode) return SendMessageW (hWnd, Msg, wParam, lParam);
           
    return SendMessageA (hWnd, Msg, wParam, lParam);
    }


    public static final native int SendMessageW (int hWnd, int Msg, int wParam, int lParam);

    public static final native int SendMessageA (int hWnd, int Msg, int wParam, int lParam);

    我們看到了兩個版本,一個版本針對Unicode,另一個版本針對ASCII,正好Win32 API也是如此,我們在這里看到的是native的方法,這意味著具體還有一組JNIC代碼來直接與操作系統的函數打交道:

    #ifndef NO_SendMessageW__IIII
    JNIEXPORT jint JNICALL OS_NATIVE(SendMessageW__IIII)
           (JNIEnv 
    *env, jclass that, jint arg0, jint arg1, jint arg2, jint arg3)
    {
           jint rc;
           OS_NATIVE_ENTER(env, that, SendMessageW__IIII_FUNC);
           rc 
    = (jint)SendMessageW((HWND)arg0, arg1, (WPARAM)arg2, (LPARAM)arg3);
           OS_NATIVE_EXIT(env, that, SendMessageW__IIII_FUNC);
           
    return rc;
    }

    #endif

    #ifndef NO_SendMessageA__IIII
    JNIEXPORT jint JNICALL OS_NATIVE(SendMessageA__IIII)
           (JNIEnv 
    *env, jclass that, jint arg0, jint arg1, jint arg2, jint arg3)
    {
           jint rc;
           OS_NATIVE_ENTER(env, that, SendMessageA__IIII_FUNC);
           rc 
    = (jint)SendMessageA((HWND)arg0, arg1, (WPARAM)arg2, (LPARAM)arg3);
           OS_NATIVE_EXIT(env, that, SendMessageA__IIII_FUNC);
           
    return rc;
    }

    #endif

    看到這里,你也許已經恍然大悟:SWT所做的無非就是把Win32API簡單的包裝了一下,我們在SWT這一層調用的方法、傳遞的參數被原封不動的代理到了Win32層。這就是SWT的核心思想。SWT有一個很重要的設計原則,那就是,SWTAPI一對一的封裝OSAPI,完全忠實于操作系統的API實現的行為,如果有bug,那也是OSbug,它不會嘗試去糾正操作系統,因為那樣會潛在的破壞本地化的一些行為。忠實于OS也使得調用者不必但心自己的SWT程序會跟OS的本地GUI有不一致的地方,如有必要直接參考MSDN即可。SWT其實就是這樣一個thin wrapper,我們通過它可以方便的訪問Win32的圖形API,為我們的應用程序提供nativeLook & Feel。

    下面給出一個完整的SWT示例:

    package sean.test.swt;

    import org.eclipse.swt.SWT;
    import org.eclipse.swt.layout.FillLayout;
    import org.eclipse.swt.widgets.Display;
    import org.eclipse.swt.widgets.Shell;
    import org.eclipse.swt.widgets.Text;

    public class DummySWT {

           
    public static void main(String[] args) {
                  final Display display 
    = new Display();
                  final Shell shell 
    = new Shell(display);
                  shell.setLayout(
    new FillLayout());
                  final Text text 
    = new Text(shell, SWT.SINGLE);
                  text.setText(
    "abcdefgh");
                  text.setSelection(
    36);
                  shell.pack();
                  shell.open();
                  
    while (!shell.isDisposed()) {
                         
    if (!display.readAndDispatch()) {
                                display.sleep();
                         }

                  }

                  display.dispose();
           }


    }


    轉自:http://m.tkk7.com/sean/archive/2005/03/20/2255.html

    posted on 2005-05-26 23:46 weidagang2046 閱讀(222) 評論(0)  編輯  收藏 所屬分類: Java

    主站蜘蛛池模板: 亚洲中文字幕无码久久2020| 亚洲AV人人澡人人爽人人夜夜| 亚洲国产成人精品无码区在线秒播 | 无码国产亚洲日韩国精品视频一区二区三区 | 毛片免费在线观看网址| 亚洲一级毛片免费观看| 免费精品人在线二线三线区别| 亚洲乱码卡三乱码新区| 欧美在线看片A免费观看| 亚洲色偷偷偷综合网| 成在线人永久免费视频播放| 处破女第一次亚洲18分钟| 亚洲第一区精品日韩在线播放| 国产97视频人人做人人爱免费| 亚洲啪啪AV无码片| 99热免费在线观看| 亚洲视频在线观看2018| 国产嫩草影院精品免费网址| 一级毛片免费一级直接观看| 国产∨亚洲V天堂无码久久久| 免费一级毛片免费播放| 成年免费a级毛片| 亚洲成av人片一区二区三区| 亚洲AV无码专区国产乱码4SE| 国产一精品一av一免费爽爽| 亚洲麻豆精品果冻传媒| 在线观看日本免费a∨视频| 国产成人亚洲综合a∨| 亚洲啪啪综合AV一区| 91成人免费在线视频| 国产亚洲精品精品精品| 国精无码欧精品亚洲一区| 69堂人成无码免费视频果冻传媒| 亚洲成a∧人片在线观看无码| 亚洲免费观看视频| aa级一级天堂片免费观看| 一级毛片a免费播放王色电影| 亚洲综合在线成人一区| 免费在线观看黄色毛片| www视频免费看| ssswww日本免费网站片|