Archive for the ‘Java’ Category

  1. Hello, SWT(Java) World!

    Posted on 11月 3rd, 2012 by cx20

    SWT(Java)

    SWT(Standard Widget Toolkit) は Java で GUI を扱うためのライブラリである。
    IBM により AWT や Swing を置き換える目的で作成された。

    ソースコード

    import org.eclipse.swt.SWT;
    import org.eclipse.swt.widgets.*;
    import org.eclipse.swt.layout.*;
     
    public class Hello {
        public static void main (String [] args) {
            Display display = new Display();
            Shell shell = new Shell(display);
            shell.setText("Hello, World");
     
            FillLayout layout = new FillLayout(SWT.VERTICAL);
            shell.setLayout(layout);
     
            Label label = new Label(shell,SWT.BORDER);
            label.setText("Hello, SWT World!");
     
            shell.setSize( 640, 480 );
            shell.open();
     
            while (!shell.isDisposed()) {
                if (!display.readAndDispatch()) {
                    display.sleep();
                }
            }
     
            display.dispose();
        }
    }

    コンパイル&実行方法

    C:¥> javac -cp org.eclipse.swt.win32.win32.x86_3.6.1.v3655c.jar;. Hello.java
    C:¥> javaw -cp org.eclipse.swt.win32.win32.x86_3.6.1.v3655c.jar;. Hello

    実行結果

    +------------------------------------------+
    |Hello, World!                    [_][~][X]|
    +------------------------------------------+
    |Hello, SWT World!                         |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    +------------------------------------------+
  2. Hello, Swing(Java) World!

    Posted on 11月 2nd, 2012 by cx20

    Swing(Java)

    Swing は AWT(Abstract Window Toolkit) を拡張したものであり Java で GUI を扱うためのライブラリである。
    J2SE 1.2 以降は AWT よりも Swing が使われることが多くなっている。

    ソースコード

    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
     
    public class Hello extends JFrame {
        public static void main( String args [] ) {
            Hello frame = new Hello( "Hello, World" );
            frame.setVisible( true );
        }
     
        Hello( String title ) {
            super( title );
            setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
            setLocationRelativeTo( null );
            setSize( 640, 480 );
     
            JLabel label = new JLabel( "Hello, Swing World!" );
            label.setVerticalAlignment(JLabel.TOP);
            add( label );
        }
    }

    コンパイル&実行方法

    C:¥> javac Hello.java
    C:¥> javaw Hello

    実行結果

    +------------------------------------------+
    |Hello, World!                    [_][~][X]|
    +------------------------------------------+
    |Hello, Swing World!                       |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    +------------------------------------------+
  3. Hello, AWT(Java) World!

    Posted on 11月 1st, 2012 by cx20

    AWT(Java)

    AWT(Abstract Window Toolkit) は Java で GUI を扱うためのライブラリである。
    J2SE 1.2 以降は AWT を拡張した Swing が使われることが多くなっている。

    ソースコード

    import java.awt.*;
    import java.awt.event.*;
     
    public class Hello extends Frame {
        public static void main(String [] args) {
            Hello frame = new Hello( "Hello, World" );
            frame.setVisible(true);
        }
     
        Hello( String title ) {
            super( title );
            addWindowListener(new HelloWindowAdapter());
            setSize(640, 480);
     
            setLayout(new FlowLayout(FlowLayout.LEFT));
     
            Label label = new Label("Hello, AWT World!");
            add(label);
        }
     
    }
     
    class HelloWindowAdapter extends WindowAdapter {
        public void windowClosing(WindowEvent e) {
            System.exit(0);
        }
    }

    コンパイル&実行方法

    C:¥> javac Hello.java
    C:¥> javaw Hello

    実行結果

    +------------------------------------------+
    |Hello, World!                    [_][~][X]|
    +------------------------------------------+
    |Hello, AWT World!                         |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    +------------------------------------------+
  4. Hello, JDBC Type1(BeanShell) World!

    Posted on 10月 16th, 2012 by cx20

    JDBC Type1

    JDBC(Java Database Connectivity)は、Java 用のデータベース接続 API である。実装方法によりType1~4の4つのタイプが存在する。
    Type1 は JDBC と ODBC の API をマップさせたブリッジドライバである。
    以下は BeanShell による JDBC ライブラリの使用例となっている。

    ソースコード(BeanShell + JDBC Type1 + ODBC + Jet データベース)

    import java.sql.*;
     
    Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
    conn = DriverManager.getConnection("jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=.\hello.mdb", "", "");
    stmt = conn.createStatement();
    rs = stmt.executeQuery("SELECT 'Hello, JDBC Type1 World!' AS Message");
    while ( rs.next() ) {
        System.out.println( rs.getString(1) );
    }
    rs.close();
    stmt.close();
    conn.close();

    ソースコード(BeanShell + JDBC Type1 + ODBC + ACE データベース)

    import java.sql.*;
    import sun.jdbc.odbc.*;
     
    Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
    conn = DriverManager.getConnection("jdbc:odbc:Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=.\hello.accdb", "", "");
    stmt = conn.createStatement();
    rs = stmt.executeQuery("SELECT 'Hello, JDBC Type1 World!' AS Message");
    while ( rs.next() ) {
        System.out.println( rs.getString(1) );
    }
    rs.close();
    stmt.close();
    conn.close();

    ソースコード(BeanShell + JDBC Type1 + ODBC + SQL Server)

    import java.sql.*;
     
    Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
    conn = DriverManager.getConnection("jdbc:odbc:Driver={SQL Server};SERVER=(local)", "sa", "P@ssW0rd");
    stmt = conn.createStatement();
    rs = stmt.executeQuery("SELECT 'Hello, JDBC Type1 World!' AS Message");
    while ( rs.next() ) {
        System.out.println( rs.getString(1) );
    }
    rs.close();
    stmt.close();
    conn.close();

    ソースコード(BeanShell + JDBC Type1 + ODBC + Oracle)

    import java.sql.*;
     
    Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
    conn = DriverManager.getConnection("jdbc:odbc:Driver={Oracle in OraDb11g_home1};DBQ=ORCL", "scott", "tiger");
    stmt = conn.createStatement();
    rs = stmt.executeQuery("SELECT 'Hello, JDBC Type1 World!' AS Message FROM DUAL");
    while ( rs.next() ) {
        System.out.println( rs.getString(1) );
    }
    rs.close();
    stmt.close();
    conn.close();

    ソースコード(BeanShell + JDBC Type1 + ODBC + MySQL)

    import java.sql.*;
     
    Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
    conn = DriverManager.getConnection("jdbc:odbc:Driver={MySQL ODBC 5.1 Driver};Server=localhost", "root", "P@ssW0rd");
    stmt = conn.createStatement();
    rs = stmt.executeQuery("SELECT 'Hello, JDBC Type1 World!' AS Message");
    while ( rs.next() ) {
        System.out.println( rs.getString(1) );
    }
    rs.close();
    stmt.close();
    conn.close();

    実行方法

    C:¥> java -cp bsh-2.0b4.jar;. bsh.Interpreter hello.bsh

    実行結果

    Hello, JDBC Type1 World!
  5. Hello, JDBC Type1(Groovy) World!

    Posted on 10月 1st, 2012 by cx20

    JDBC Type1

    JDBC(Java Database Connectivity)は、Java 用のデータベース接続 API である。実装方法によりType1~4の4つのタイプが存在する。
    Type1 は JDBC と ODBC の API をマップさせたブリッジドライバである。
    以下は Groovy による JDBC ライブラリの使用例となっている。

    ソースコード(Groovy + JDBC Type1 + ODBC + Jet データベース)

    import groovy.sql.Sql
    class Hello {
        static void main(args) {
            Sql sql = Sql.newInstance("jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=.\hello.mdb", 
               "", "", "sun.jdbc.odbc.JdbcOdbcDriver")
            sql.eachRow("SELECT 'Hello, JDBC Type1 World!' AS Message"){
                println it.Message
            }
        }
    }

    ソースコード(Groovy + JDBC Type1 + ODBC + ACE データベース)

    import groovy.sql.Sql
    class Hello {
        static void main(args) {
            Sql sql = Sql.newInstance("jdbc:odbc:Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=.\hello.accdb", 
               "", "", "sun.jdbc.odbc.JdbcOdbcDriver")
            sql.eachRow("SELECT 'Hello, JDBC Type1 World!' AS Message"){
                println it.Message
            }
        }
    }

    ソースコード(Groovy + JDBC Type1 + ODBC + SQL Server)

    import groovy.sql.Sql
    class Hello {
        static void main(args) {
            Sql sql = Sql.newInstance("jdbc:odbc:Driver={SQL Server};SERVER=(local);DATABASE=master", 
               "sa", "P@ssword", "sun.jdbc.odbc.JdbcOdbcDriver")
            sql.eachRow("SELECT 'Hello, JDBC Type1 World!' AS Message"){
                println it.Message
            }
        }
    }

    ソースコード(Groovy + JDBC Type1 + ODBC + Oracle)

    import groovy.sql.Sql
    class Hello {
        static void main(args) {
            Sql sql = Sql.newInstance("jdbc:odbc:Driver={Oracle in OraDb11g_home1};DBQ=ORCL", 
               "scott", "tiger", "sun.jdbc.odbc.JdbcOdbcDriver")
            sql.eachRow("SELECT 'Hello, JDBC Type1 World!' AS Message FROM DUAL"){
                println it.Message
            }
        }
    }

    実行方法

    C:¥> groovy Hello.groovy

    実行結果

    Hello, JDBC Type1 World!
  6. Hello, Win32 GUI(SWT) World!

    Posted on 7月 18th, 2012 by cx20

    Win32 GUI(Java)

    Win32 アプリケーションは Windows 標準 API である Win32 API を使用した Windows アプリケーションである。
    以下は Java の GUI ツールキット SWT の非公開 API を使用した Win32 GUI アプリケーション の例となっている。

    ソースコード

    import org.eclipse.swt.internal.Callback;
    import org.eclipse.swt.internal.win32.MSG;
    import org.eclipse.swt.internal.win32.OS;
    import org.eclipse.swt.internal.win32.PAINTSTRUCT;
    import org.eclipse.swt.internal.win32.RECT;
    import org.eclipse.swt.internal.win32.TCHAR;
    import org.eclipse.swt.internal.win32.WNDCLASS;
     
    public class Hello {
        public static int WndProc(int hWnd, int uMsg, int wParam, int lParam) {
            int hdc;
            PAINTSTRUCT lpPaint = new PAINTSTRUCT();
            String strMessage = "Hello, Win32 GUI(SWT) World!";
     
            switch (uMsg) {
            case OS.WM_PAINT:
                RECT rect = new RECT();
                hdc = OS.BeginPaint(hWnd, lpPaint);
                OS.GetClientRect(hWnd, rect);
                OS.DrawTextW(hdc, strMessage.toCharArray(), strMessage.length(), rect, OS.DT_SINGLELINE);
                OS.EndPaint(hWnd, lpPaint);
                return 0;
            case OS.WM_DESTROY:
                System.exit(wParam);
            default:
                return OS.DefWindowProc(hWnd, uMsg, wParam, lParam);
            }
        }
     
        public static void WinMain(String[] args) {
            int hInstance = OS.GetModuleHandle(null);
            TCHAR className  = new TCHAR(0, "helloWindow", true);
            TCHAR windowName = new TCHAR(0, "Hello, World", true);
     
            WNDCLASS wc      = new WNDCLASS();
            wc.style         = OS.CS_HREDRAW | OS.CS_VREDRAW;
            wc.lpfnWndProc   = new Callback(Hello.class, "WndProc", 4).getAddress();
            wc.hInstance     = hInstance;
            wc.hCursor       = OS.LoadCursor(0, OS.IDC_ARROW);
            wc.hbrBackground = OS.GetStockObject(OS.COLOR_WINDOW + 1 );
            wc.lpszClassName = OS.HeapAlloc(OS.GetProcessHeap(), OS.HEAP_ZERO_MEMORY, className.length() * 2);
            OS.MoveMemory(wc.lpszClassName, className, className.length() * 2);
     
            OS.RegisterClass(wc);
     
            int hWnd = OS.CreateWindowEx(
                0,
                className,
                windowName,
                OS.WS_OVERLAPPEDWINDOW,
                OS.CW_USEDEFAULT, 
                OS.CW_USEDEFAULT,
                640,
                480,
                0,
                0,
                hInstance,
                null);
     
            OS.ShowWindow(hWnd, OS.SW_SHOW);
            OS.UpdateWindow(hWnd);
     
            MSG lpMsg = new MSG();
            while (OS.GetMessage(lpMsg, 0, 0, 0)) {
                OS.TranslateMessage(lpMsg);
                OS.DispatchMessage(lpMsg);
            }
        }
     
        public static void main(String[] args) {
            WinMain( args );
        }
     
    }

    コンパイル&実行方法

    C:¥> javac -cp org.eclipse.swt.win32.win32.x86_3.6.1.v3655c.jar;. Hello.java
    C:¥> java -cp org.eclipse.swt.win32.win32.x86_3.6.1.v3655c.jar;. Hello

    実行結果

    +------------------------------------------+
    |Hello, World!                    [_][~][X]|
    +------------------------------------------+
    |Hello, Win32 GUI(SWT) World!              |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    +------------------------------------------+
  7. Hello, COM(Java) World!

    Posted on 5月 28th, 2012 by cx20

    COM(Java)

    COM(Component Object Model)はマイクロソフトの提唱するプログラム部品の仕様である。
    COM を用いて開発された部品であれば言語を問わず利用することができる。
    Java 自身には、COM を呼び出す機能を持っていないが、別途ライブラリを経由することで呼び出すことが可能である。
    以下は Java より JACOB(JAVA-COM Bridge) ライブラリを使用した COM クライアントの例となっている。

    ソースコード

    import com.jacob.com.Variant;
    import com.jacob.activeX.ActiveXComponent;
     
    public class Hello {
        public static void main(String[] args) {
            ActiveXComponent shell = new ActiveXComponent("Shell.Application"); 
            Variant hwnd = new Variant(0);
            Variant title = new Variant("Hello, COM(JACOB) World!");
            Variant option = new Variant(0);
            Variant rootFolder = new Variant(36);
            Variant[] params= new Variant[] { hwnd, title, option, rootFolder };
            Object folder = shell.invoke( "BrowseForFolder", params );
        }
    }

    コンパイル&実行方法

    C:¥> javac -cp "jacob.jar;." Hello.java
    C:¥> java -cp "jacob.jar;." Hello

    実行結果

    +----------------------------------------+
    |Browse For Folder                    [X]|
    +----------------------------------------+
    | Hello, COM(JACOB) Wolrd!               |
    |                                        |
    | +------------------------------------+ |
    | |[Windows]                           | |
    | | +[addins]                          | |
    | | +[AppCompat]                       | |
    | | +[AppPatch]                        | |
    | | +[assembly]                        | |
    | |     :                              | |
    | |     :                              | |
    | |     :                              | |
    | +------------------------------------+ |
    | [Make New Folder]    [  OK  ] [Cancel] |
    +----------------------------------------+
  8. Hello, Win32 API(JNI) World!

    Posted on 5月 3rd, 2012 by cx20

    Win32 API(JNI)

    Win32 API は、Windows の機能にアクセスする為の API(Application Programming Interface)である。
    以下は JNI(Java Native Interface)による呼出し例である。
    Java からは 直接、Win32 API を呼び出すことは出来ないが、JNI 用の DLL を作成することで呼び出すことが可能となっている。

    ソースコード(Java)

    import java.io.*;
     
    public class Hello {
        static {
            System.loadLibrary("Hello");
        }
     
        public native int MessageBox( int hwnd, String text, String title, int type );
     
        public static void main(String args[]) {
            Hello hello = new Hello();
            hello.MessageBox( 0, "Hello, Win32 API(JNI) World!", "Hello, World!", 0 );
        }
    }

    C ヘッダファイル作成

    C:¥> javah -jni Hello

    ソースコード(C ヘッダファイル)

    /* DO NOT EDIT THIS FILE - it is machine generated */
    #include <jni.h>
    /* Header for class Hello */
     
    #ifndef _Included_Hello
    #define _Included_Hello
    #ifdef __cplusplus
    extern "C" {
    #endif
    /*
     * Class:     Hello
     * Method:    MessageBox
     * Signature: (ILjava/lang/String;Ljava/lang/String;I)I
     */
    JNIEXPORT jint JNICALL Java_Hello_MessageBox
      (JNIEnv *, jobject, jint, jstring, jstring, jint);
     
    #ifdef __cplusplus
    }
    #endif
    #endif

    ソースコード(C 実装ファイル)

    #include "Hello.h"
    #include <windows.h>
     
    /*
     * Class:     Hello
     * Method:    MessageBox
     * Signature: (ILjava/lang/String;Ljava/lang/String;I)I
     */
    JNIEXPORT jint JNICALL Java_Hello_MessageBox
      (JNIEnv* env, jobject me, jint hwnd, jstring text, jstring caption, jint type)
    {
    #ifdef UNICODE
        const jchar* _text = env->GetStringChars(text, 0); 
        const jchar* _caption = env->GetStringChars(caption, 0); 
        const int result = MessageBoxW(NULL, (LPCWSTR)_text, (LPCWSTR)_caption, type); 
        env->ReleaseStringChars(text, _text); 
        env->ReleaseStringChars(caption, _caption); 
    #else
        /* このコードはマルチバイト文字(MBCS)を考慮していない為、全角文字列を渡した場合に文字化けする。正しくは SJIS に変換する処理が必要。*/
        const char* _text = env->GetStringUTFChars(text, 0); 
        const char* _caption = env->GetStringUTFChars(caption, 0); 
        const int result = MessageBoxA(NULL, (LPCSTR)_text, (LPCSTR)_caption, type); 
        env->ReleaseStringUTFChars(text, _text); 
        env->ReleaseStringUTFChars(caption, _caption); 
    #endif
        return result; 
    }

    Win32 データ型と JNI データ型の対応は主に以下のようになっている。

    Win32 データ型 C/C++ データ型 JNI データ型 Java データ型
    BOOL int jboolean boolean
    BYTE char jbyte byte
    WCHAR wchar_t jchar char
    SHORT short jshort short
    INT int jint int
    LONGLONG __int64 jlong long
    FLOAT float jfloat float
    DOUBLE double jdouble double
    VOID void void void
    LPCSTR const char * jstring string
    LPCWSTR const wchar_t * jstring string

    なお、jstring については、使用時に、正しい C/C++ データ型(ANSI, MBCS / UNICODE)に適宜、変換する必要がある。

    DLL作成(Visual C++)

    C:¥> SET INCLUDE=%JAVA_HOME%include;%JAVA_HOME%includewin32;%INCLUDE%
    C:¥> cl Hello.cpp /LD /link user32.lib

    コンパイル&実行方法

    C:¥> javac Hello.java
    C:¥> java Hello

    実行結果

    ---------------------------
    Hello, World!
    ---------------------------
    Hello, Win32 API(JNI) World!
    ---------------------------
    OK   
    ---------------------------
  9. Hello, Win32 API(JNA) World!

    Posted on 5月 2nd, 2012 by cx20

    Win32 API(JNA)

    Win32 API は、Windows の機能にアクセスする為の API(Application Programming Interface)である。
    以下は JNA(Java Native Access)による呼出し例である。

    ソースコード

    import com.sun.jna.Native;
    import com.sun.jna.win32.StdCallLibrary;
     
    public class Hello {
        public interface User32 extends StdCallLibrary {
            User32 INSTANCE = (User32) Native.loadLibrary("user32", User32.class);
            int MessageBoxA(int hwnd, String text, String caption, int type);
        }
     
        public static void main(String[] args) {
            User32 user32 = User32.INSTANCE;
            user32.MessageBoxA(0, "Hello, Win32 API(JNA) World!", "Hello, World!", 0);
        }
    }

    Win32 データ型と JNA データ型の対応は主に以下のようになっている。

    Win32 データ型 C/C++ データ型 Java/JNA データ型
    BYTE char byte
    SHORT short short
    WCHAR wchar_t char
    INT int int
    BOOL int boolean
    LONG long NativeLong(JNA データ型)
    LONGLONG __int64 long
    FLOAT float float
    DOUBLE double double
    LPCSTR const char * String
    LPCWSTR const wchar_t * WString(JNA データ型)
    LPINT int * IntByReference(JNA データ型)
    LPVOID void * Pointer

    コンパイル&実行方法

    C:¥> javac -cp jna.jar;. Hello.java
    C:¥> java -cp jna.jar;. Hello

    実行結果

    ---------------------------
    Hello, World!
    ---------------------------
    Hello, Win32 API(JNA) World!
    ---------------------------
    OK   
    ---------------------------
  10. Hello, JNI World!

    Posted on 4月 10th, 2012 by cx20

    JNI

    JNA(Java Native Interface)は、Java と他の言語のインターフェイス仕様である。
    Java から C言語のライブラリの呼び出し、また、C言語から Java のライブラリの呼び出し等が可能である。
    ここでは、C言語から Java のライブラリの呼び出しのサンプルを記載する。

    ソースコード(呼び出す側(C++))

    #include <jni.h>
     
    int main( int argc, char* argv[] )
    {
        JNIEnv* env;
        JavaVM* jvm;
     
        // Java VM オプション設定
        JavaVMOption options[1];
        options[0].optionString = "-Xmx128m";
     
        JavaVMInitArgs vm_args;
        vm_args.version = JNI_VERSION_1_6;
        vm_args.options = options;
        vm_args.nOptions = 1;
     
        // Java VM 作成
        JNI_CreateJavaVM(&jvm, (void **)&env, &vm_args);
        // Class 検索
        jclass clazz = env->FindClass("Hello");
        // Method ID 取得
        jmethodID mid = env->GetStaticMethodID(clazz, "main", "([Ljava/lang/String;)V");
        // Class メソッド呼び出し
        env->CallStaticVoidMethod(clazz, mid, NULL);
        // Java VM 破棄
        jvm->DestroyJavaVM();
     
        return 0;
    }

    ソースコード(呼び出される側(Java))

    public class Hello {
        public static void main( String[] args ) {
            System.out.println( "Hello, JNI World!" );
        }
    }

    コンパイル&実行方法

    $ javac Hello.java
    $ c++ -o jnihello jnihello.cpp ¥
    -I/System/Library/Frameworks/JavaVM.framework/Versions/Current/Headers/ ¥
    -framework JavaVM ¥
    -m64
    $ ./jnihello

    実行結果

    Hello, JNI World!