Archive for the ‘Java’ Category
-
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! | | | | | | | | | | | | | | | | | | | +------------------------------------------+
-
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! | | | | | | | | | | | | | | | | | | | +------------------------------------------+
-
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! | | | | | | | | | | | | | | | | | | | +------------------------------------------+
-
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!
-
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!
-
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! | | | | | | | | | | | | | | | | | | | +------------------------------------------+
-
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] | +----------------------------------------+
-
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 ---------------------------
-
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 ---------------------------
-
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!