SQLの窓

2016年05月31日


Java のコンソールで NAVER の RSS を取得して、title 部分を正規表現で加工して表示するサンプル

java.util.regex.Matcher
java.util.regex.Pattern

groupCount で取得されるのは、部分一致した数なので、() を使用しなければ、戻り値は 0 となります。また、その場合は group() で取得できますし。group(0) でも取得できます。

なので、常に pattern に一致する文字列は group(0) です。group(n) で n が 1 以上は部分一致となります。
よって、部分一致のみのループは、for( int i = 1; i <= m.groupCount(); i++ ) となります。
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.regex.Matcher;
import java.util.regex.Pattern;


public class Main {

	public static void main(String[] args) {
		
		Pattern p;
		Matcher m;
		int len;

		print("処理開始");

		// NAVER の RSS
		String str = httpGet("http://matome.naver.jp/feed/hot");

        // 部分一致の無い パターンを生成
        p = Pattern.compile("<title>.+?</title>");
        m = p.matcher(str);

        // 部分一致した数( 0 になります )
        len = m.groupCount();
        print( Integer.toString(len) );

        while(m.find()) {
        	// 部分一致は無いので、m.group() で パターン
        	// に対する全体一致を取得
       		System.out.println(m.group());
        }

		print("------------------------------------------");
        
        // 部分一致のあるパターンを生成
        p = Pattern.compile("<title>(.+?)</title>");
        m = p.matcher(str);

        // 部分一致した数 ( 1になります )
        len = m.groupCount();
        print( Integer.toString(len) );
        
        while(m.find()) {
        	// m.group(0) はパターンに対する全体一致なので
        	// 1 から始めて部分一致のみ表示
        	for( int i = 1; i < (len +1); i++) {
        		System.out.println(m.group(i));
        	}
        }
        
		print("------------------------------------------");
        
        // 部分一致のあるパターンを生成
        p = Pattern.compile("(<title>)(.+?)(</title>)");
        m = p.matcher(str);

        len = m.groupCount();
        print( Integer.toString(len) );

        String partsString;
        StringBuilder buffer;
        while(m.find()) {
    		buffer = new StringBuilder();
        	for( int i = 1; i < (len +1); i++) {

        		// title 開始タグ
        		if ( i == 1) {
        			buffer.append("『");
        		}
        		// title 内容
        		if ( i == 2) {
            		partsString = m.group(2);
            		// String クラスの正規表現置換
            		// 文の区切り的文字で改行
            		partsString = partsString.replaceAll("[。、.…!?]+", "\n");
        			buffer.append(partsString);
        		}
        		// title 終了タグ
        		if ( i == 3) {
        			buffer.append("』");
        		}
        	}
    		print(buffer.toString());
    		print("");
        }

	}
	
	// ********************************
	// データ表示用
	// ********************************
	public static void print( String s ) {
		System.out.println(s);
	}	

	// ********************************
	// static void main より呼び出す為の
	// static な インターネットアクセス関数 
	// ********************************
	public static String httpGet( String s ) {

		String result = "";

		try {
			URL url = new URL(s);

			HttpURLConnection http = (HttpURLConnection)url.openConnection();
			http.setRequestMethod("GET");
			http.connect();
			InputStream is = http.getInputStream();

			InputStreamReader isr = new InputStreamReader(is,"UTF8");
			BufferedReader br = new BufferedReader(isr);
			String line_buffer;
			StringBuilder sb = new StringBuilder();

			while(null != (line_buffer = br.readLine() )) {

				sb.append(String.format("%s\n",line_buffer));

			}

			br.close();
			isr.close();
			is.close();

			result = sb.toString();

		} catch (Exception e) {
			e.printStackTrace();
		}

		return result;

	}	

}




posted by lightbox at 2016-05-31 12:00 | Comment(0) | Java | このブログの読者になる | 更新情報をチェックする

2015年06月28日


Eclipse で、文字列内のファイルのパスの \ 記号を \\ にする方法


 

このチェックボックスをオンにすると、"" の中にクリップボードから文字列を貼り付ける場合に、" や \ の後になんらかの文字が続いている場合は、" が \" に \ が \\ になります。

この為、Windows のパスをそのまま "" の中に貼り付けると、全ての \ が \\ となり、そのまま使用可能になります。

※ " や \ を単独で貼り付けても変化はしません。
※ コメント内は対象になりません

既に \ で作成されている文字列は、範囲を選択して SHIFT + DEL で削除して、再度貼り付けるといいです。

※ この場合、SHIFT + INS で貼り付けるとキー操作は最速になります。


posted by lightbox at 2015-06-28 21:43 | Java | このブログの読者になる | 更新情報をチェックする

2015年06月18日


Java で JSON 文字列を オブジェクトに変換する Google Gson の基本 4 パターン

ほぼ Google Gson のユーザガイドに記述されている内容です。
一般 JSON オブジェクトフォーマット

JSON 文字列のルートがいきなり、 JSON オブジェクトの一般プロパティになっている場合です。
{
    "link": "http://www.yahoo.co.jp/",
    "name": "Yahoo! JAPAN"
}
一番使う事の多いパターンの基本で、そのフォーマットのクラス定義を作成して、Gson に展開してもらいます。 一般 配列フォーマット JSON 文字列のルートがいきなり、 JSON オブジェクトの配列になっている場合で、データとしては特殊な部類になります。
[
    "http://www.yahoo.co.jp/",
    "Yahoo! JAPAN"
]
ですが、Gson 側では以下のように比較的簡単に扱えます String[] data = gson.fromJson(json, String[].class); また、これは Java での作業の都合で、ArrayList に変更する事も可能です。(但し、少し面倒です) Type arrayListType = new TypeToken>(){}.getType(); ArrayList al = gson.fromJson(json, arrayListType); 配列の中のデータ毎に型が違うフォーマット
[
    "サイトデータ",
    1,
    {
        "link": "http://www.yahoo.co.jp/",
        "name": "Yahoo! JAPAN"
    }
]
このタイプが一番面倒です。通常使われる事は無いと思いますが、使用する場合は一つ一つ対応する事になると思います。( Gson でのオリジルサンプルコードはここにあります ) オブジェクト内にオブジェクト配列
{
    "title": "サイトデータ",
    "number": 2,
    "urlList": [
        {
            "link": "http://www.yahoo.co.jp/",
            "name": "Yahoo! JAPAN"
        },
        {
            "link": "https://www.google.co.jp/",
            "name": "Google"
        }
    ]
}
データフォーマットとしてはこれが一番優れており、全てクラスを定義する事によって容易に対応できます。
import java.lang.reflect.Type;
import java.util.ArrayList;

import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonParser;
import com.google.gson.reflect.TypeToken;


public class Main {

	// メンバ用クラス
	class LinkFormat {
		String link;
		String name;
	}
	
	// メンバに配列
	class SiteData {
		String title;
		int number;
		
		LinkFormat[] urlList;
	}
	
	// メンバに ArrayList
	class SiteDataList {
		String title;
		int number;
		
		ArrayList <LinkFormat> urlList;
	}
		
	public static void main(String[] args) {
	
		String json = null;
		
		// 一般 JSON オブジェクトフォーマット
		System.out.println("-----------------------------------------");
		
		json = "";
		json += "{";
		json += 	"\"link\":\"http://www.yahoo.co.jp/\",";
		json += 	"\"name\":\"Yahoo! JAPAN\"";
		json += "}";
		System.out.println(json);

		Gson gson = new Gson();

		// オブジェクトに変換
		System.out.println("-----------------------------------------");
		
		LinkFormat linkFormat = gson.fromJson(json, LinkFormat.class);

		System.out.println(linkFormat.link);
		System.out.println(linkFormat.name);

		// 一般 配列フォーマット
		System.out.println("-----------------------------------------");
		
		json = "";
		json += "[";
		json += 	"\"http://www.yahoo.co.jp/\",";
		json += 	"\"Yahoo! JAPAN\"";
		json += "]";
		System.out.println(json);

		// 配列に変換
		String[]  data = gson.fromJson(json, String[].class);

		System.out.println(data[0]);
		System.out.println(data[1]);

		// ArrayListに変換
		System.out.println("-----------------------------------------");
		
		Type arrayListType = new TypeToken<ArrayList<String>>(){}.getType();
		ArrayList<String>  al = gson.fromJson(json, arrayListType);

		System.out.println(al.get(0));
		System.out.println(al.get(1));

		// 特殊 JSON オブジェクト配列フォーマット
		System.out.println("-----------------------------------------");
		
		json = "";
		json += "[";
		json += 	"\"サイトデータ\",";
		json += 	"1,";
		json += 	"{";
		json += 		"\"link\":\"http://www.yahoo.co.jp/\",";
		json += 		"\"name\":\"Yahoo! JAPAN\"";
		json += 	"}";
		json += "]";
		System.out.println(json);

		// JSON 文字列配列内の型が違う場合はひとつひとつ対応
		JsonParser parser = new JsonParser();
		JsonArray array = parser.parse(json).getAsJsonArray();
		String title = gson.fromJson(array.get(0), String.class);
		int number = gson.fromJson(array.get(1), int.class);
		LinkFormat lf = gson.fromJson(array.get(2), LinkFormat.class);

		System.out.println( title );
		System.out.println( number );
		System.out.println( lf.link );
		System.out.println( lf.name );

		// JSON オブジェクト内にオブジェクト配列
		System.out.println("-----------------------------------------");
		
		json = "";
		json += "{";
		json += "\"title\" : \"サイトデータ\",";
		json += "\"number\" : 2,";
		json += "\"urlList\" : [";
		json += 	"{";
		json += 		"\"link\":\"http://www.yahoo.co.jp/\",";
		json += 		"\"name\":\"Yahoo! JAPAN\"";
		json += 	"},";
		json += 	"{";
		json += 		"\"link\":\"https://www.google.co.jp/\",";
		json += 		"\"name\":\"Google\"";
		json += 	"}";
		json += "]";
		json += "}";
		System.out.println(json);
		
		// 配列バージョン
		SiteData sd = gson.fromJson(json, SiteData.class);
		System.out.println( sd.title );
		System.out.println( sd.number );
		System.out.println( sd.urlList[0].link );
		System.out.println( sd.urlList[0].name );
		System.out.println( sd.urlList[1].link );
		System.out.println( sd.urlList[1].name );

		// ArrayList バージョン
		SiteDataList sdl = gson.fromJson(json, SiteDataList.class);
		System.out.println( sdl.title );
		System.out.println( sdl.number );
		System.out.println( sdl.urlList.get(0).link );
		System.out.println( sdl.urlList.get(0).name );
		System.out.println( sdl.urlList.get(1).link );
		System.out.println( sdl.urlList.get(1).name );

	}

}


※ 整形したい場合は以下のようにします
// オブジェクトを整形して JSON 文字列に変換する
Gson gsonPretty = new GsonBuilder().setPrettyPrinting().create();
String jsonString = gsonPretty.toJson(sd);


タグ:java JSON
posted by lightbox at 2015-06-18 02:18 | Java | このブログの読者になる | 更新情報をチェックする

2015年05月05日


Java : Google gson 2.3.1 で JSON 文字列を定義済みのクラスを使ってオブジェクト化

処理としては、以下の記事の続きになります。

Eclipse + JFace : HttpURLConnection で GET

※ Google gson のダウンロードはこちら
※ Google gson の実装はこちら
※ オンラインドキュメントはこちら

まずは、JSON データとして WEB API を

Livedoor の お天気Webサービスを使用します。地域id を指定するだけで、その地域の天気データを取得できる API です。

▼ 大阪
http://weather.livedoor.com/forecast/webservice/json/v1?city=270000

JSON のチェックと整形は JSONLint サービスでどうぞ


Google gson 用のクラス定義

JSON のフォーマットに合わせて定義しますが、順序を合わす必要は無く、名前(変数名)を一致させるようにします。サンプルでは、文字列と整数を使っていますが、JsonElement で可能な変換はできると思います。

Getter と Setter でアプリケーションに必要な変換をそこで定義してしまってもいいと思います。

public class Weather {

	class PinpointLocation {
		String link;
		String name;
	}

	class Text {
		String text;
		String publicTime;
	}

	class Location {
		String city;
		String area;
		String prefecture;
	}

	class IntTest {
		ImageSize image;
	}

	class ImageSize {
		int width;
		int height;
	}

	PinpointLocation[] pinpointLocations;
	Location location;
	IntTest copyright;
	Text description;

	// Getter と Setter で処理する
	private String publicTime;

	String getPublicTime() {
		return publicTime.substring(0, 10);
	}
	void setPublicTime(String publicTime) {
		this.publicTime = publicTime;
	}

}


実行
	/**
	 * Create contents of the application window.
	 * @param parent
	 */
	@Override
	protected Control createContents(Composite parent) {
		Composite container = new Composite(parent, SWT.NONE);
		container.setLayout(null);
		{
			Button btnNewButton = new Button(container, SWT.NONE);
			btnNewButton.addSelectionListener(new SelectionAdapter() {
				@Override
				public void widgetSelected(SelectionEvent e) {
					System.out.println("ボタンの処理");
					HttpGet hg = new HttpGet();
					String result =
						hg.execute(
							"http://weather.livedoor.com/forecast/webservice/json/v1?city=270000",
							"utf-8"
							);
					System.out.println(result);

					Gson gson = new Gson();
					Weather json = gson.fromJson(result,Weather.class);

					// 内部クラスの変数として定義されたものをそのまま利用
					System.out.println(json.location.city);
					System.out.println(json.location.area);
					System.out.println(json.location.prefecture);
					System.out.println(json.description.text);
					System.out.println(json.description.publicTime);

					// Setter でセットされたものを Getter で取得
					System.out.println(json.getPublicTime());

					// クラスの配列として定義していたものを使用
					for( int i = 0; i < json.pinpointLocations.length; i++ ) {
						System.out.println(json.pinpointLocations[i].link);
						System.out.println(json.pinpointLocations[i].name);
					}

					// 数値変数
					System.out.println(json.copyright.image.width);
					System.out.println(json.copyright.image.height);

				}
			});
			btnNewButton.setBounds(10, 10, 81, 28);
			btnNewButton.setText("New Button");
		}

		return container;
	}



タグ:java JSON
posted by lightbox at 2015-05-05 07:15 | Java | このブログの読者になる | 更新情報をチェックする

2015年05月04日


Java : Google gson 2.3.1 で、JSON 文字列のフォーマットが解らなくてもなんとかなる『ベタ』な処理方法

本来は、fromJson メソッドを使って、JSON のフォーマットに合った定義済みのクラスを使ってオブジェクト化しますが、もっとリアルに JSON の文字列と格闘したい時に使う方法です。

処理としては、以下の記事の続きになります。

Eclipse + JFace : HttpURLConnection で GET

※ Google gson の実装はこちら
※ オンラインドキュメントはこちら

ソースコード
	/**
	 * Create contents of the application window.
	 * @param parent
	 */
	@Override
	protected Control createContents(Composite parent) {
		Composite container = new Composite(parent, SWT.NONE);
		container.setLayout(null);
		{
			Button btnNewButton = new Button(container, SWT.NONE);
			btnNewButton.addSelectionListener(new SelectionAdapter() {
				@Override
				public void widgetSelected(SelectionEvent e) {
					System.out.println("ボタンの処理");
					HttpGet hg = new HttpGet();
					String result =
							hg.execute(
									"http://localhost/basic/log_01/log.json",
									"utf-8"
									);
//					String result = hg.execute();
					System.out.println(result);

					// パーサーを取得
					JsonParser jp = new JsonParser();
					// 文字列をパース
					JsonElement je = jp.parse(result);
					// JsonObject を取得する
					JsonObject jo = je.getAsJsonObject();
					// ***********************************
					// 最初が、唯一の  "item" である事が解っており
					// しかもそれは配列なので、配列として取得する
					// ***********************************
					JsonArray ja = jo.getAsJsonArray("item");

					// ***********************************
					// 配列なので、一覧表示する為のイテレータ
					// を作成
					// ***********************************
					Iterator<JsonElement> it = ja.iterator();

					// ***********************************
					// JsonElement は、どのようなフォーマット
					// かは、定義者次第です。
					// ▼ dataset は一つ一つの項目用です
					// ***********************************
					JsonElement dataset = null;
					while( it.hasNext() ) {
						// 一つ取得( ここでは、JsonObject である事が解っています )
						dataset = it.next();
						// ***********************************
						// JsonObject から get でデータを取得します。
						// 取得した時点では  JsonElement ですが、
						// 文字列と解っているので変換します
						// ***********************************
						String text = dataset.getAsJsonObject().get("text").getAsString();
						System.out.println(text);

						// ***********************************
						// subject キーがある場合は取得します
						// ***********************************
						if ( dataset.getAsJsonObject().has("subject") ) {
							String subject = dataset.getAsJsonObject().get("subject").getAsString();
							System.out.println(subject);
						}
					}

				}
			});
			btnNewButton.setBounds(10, 10, 81, 28);
			btnNewButton.setText("New Button");
		}

		return container;
	}
ここでは、以下のようなフォーマットである事を前提に処理を書いていますが、JSON オブジェクトの中を次々に読んでタイプをチェックしながら処理する自己呼び出しのメソッドで全ての解析は可能です。





タグ:java JSON
posted by lightbox at 2015-05-04 22:30 | Java | このブログの読者になる | 更新情報をチェックする

Eclipse のホバーで追加したライブラリの javadoc を表示させる手順



ここで使っているのは、Google gson 2.3.1 です

そもそも、Google gson を使用する為に、プロジェクトに libs フォルダを作成します。後々、Android にも使うのでこうしています。そしてその中にダウンロードした gson-2.3.1.jar を保存しますが、今回わかりやすく同じフォルダに gson-2.3.1-javadoc.jar を保存しました。決してプロジェクトの中に javadoc を入れる必要はありませんが、テスト環境では便利なのでこうしています。

gson-2.3.1.jar の参照





プロジェクト内に置いてるので、『Jar 追加ボタン』でいいです。プロジェクト外なら『外部 Jar 追加ボタン』で。



追加すると、以下のようになるので、gson 2.3.1.jar を開いて内容を確認します。



Javadoc ロケーションが、『なし』になっているので、選択して編集ボタンをクリックします



javadoc が、PC のディレクトリ内にあるのならばその位置を上のラジオボタンで処理しますが、.jar であるならば下のラジオボタンを選択して、.jar を選択します。その後、検証ボタンで正しい情報が揃っているかチェックされるのでクリックします。.jar の中の任意の位置を指定する必要がある場合は、二つ目の参照ボタンで選択します。

以上で、カーソルをホバーすると、javadoc が表示されるはずです。



タグ:Eclipse javadoc
posted by lightbox at 2015-05-04 21:48 | Java | このブログの読者になる | 更新情報をチェックする

2014年05月22日


Eclipse+WindowBuilder : DBアプリケーション(社員マスタメンテ)の更新(データ修正)処理

入力チェックが正しく完了した後に、画面データから UPDATE 構文によって SQL の 更新処理を作成して実行します。UPDATE 構文で更新される行は 1 行のみであり、主キーでその行が限定されます

社員マスタ
列名 型名 最大桁 主キー 型説明
1 社員コード VARCHAR 4 1 Null で終了する Unicode 文字列
2 氏名 VARCHAR 50   Null で終了する Unicode 文字列
3 フリガナ VARCHAR 50   Null で終了する Unicode 文字列
4 所属 VARCHAR 4   Null で終了する Unicode 文字列
5 性別 INT     4 バイトの符号付き整数
6 作成日 DATETIME     日付値
7 更新日 DATETIME     日付値
8 給与 INT     4 バイトの符号付き整数
9 手当 INT     4 バイトの符号付き整数
10 管理者 VARCHAR 4   Null で終了する Unicode 文字列
11 生年月日 DATETIME     日付値
更新処理を実行する為に入力をチェックを行っていますが、かならず更新前には操作しているユーザに確認を求める必要があります。それがなければ、意図せぬ更新処理作業を行ってしまう事が十分に考えられます。更新処理はシステムによって重大な処理であり、入力者の不注意で問題が起きるような可能性は最大限排除する必要があります。
			// ここに更新処理を記述する
			int result = JOptionPane.showConfirmDialog(contentPane, "更新してよろしいですか?", "更新確認", JOptionPane.OK_CANCEL_OPTION);
			if ( result == JOptionPane.CANCEL_OPTION) {
				rdbms.close();
				return;
			}

			try {
				
				String scode = syainCode.getText();
				String sname = syainName.getText();
				String ssyozoku = syainSyozoku.getText();
				int ssex = syainSex.getSelectedIndex();
				String skyuyo = syainKyuyo.getText();
				String steate = syainTeate.getText();
				String skanri = syainKanri.getText();
				String sbirth = syainBirth.getText();
						
				String sql = "";
				sql += "update 社員マスタ set";
				sql += " 氏名 = '" + sname + "',";
				sql += " 所属 = '" + ssyozoku + "',";
				sql += " 性別 = " + ssex + ",";
				sql += " 給与 = " + skyuyo + ",";
				if ( steate.trim().equals("") ) {
					sql += " 手当 = NULL,";
				}
				else {
					sql += " 手当 = " + steate + ",";
				}
				if ( skanri.trim().equals("") ) {
					sql += " 管理者 = NULL,";
				}
				else {
					sql += " 管理者 = '" + skanri + "',";
				}
				if ( sbirth.trim().equals("") ) {
					sql += " 生年月日 = NULL,";
				}
				else {
					sql += " 生年月日 = '" + sbirth + "',";
				}
				sql += " 更新日 = now()";
				sql += " where 社員コード = '" + scode + "'";
				System.out.println(sql);
				result = rdbms.stmt.executeUpdate(sql);
				System.out.println("更新件数 : " + result);
				JOptionPane.showMessageDialog(contentPane, "更新処理が実行されました");

				passControl.clearDetailes();			
				passControl.pass1Enable();			
				
				
			} catch (Exception ex) {
				ex.printStackTrace();
			}
			
			
			rdbms.close();
このコード上に、データベースへの接続処理が見えていませんが、直前に他のテーブルの行データの参照の為、既に接続済みです。また、SQLを作成する為に、入力フィールドの状況をチェックしていますが、本来の更新前のチェックで、全ての問題点が排除されているという前提でのコードとなっています。( 例 : 入力フィールドに数値以外の値や漢字スペースは含まれていない )

ここでは、SQL 文を文字列連結で作成していますが、これでは後からのメンテナンス性が悪いので、ベースとなる一文としての SQL 文をテキストで外部に作成して、データ部分を入力値で置き換えるようなクラスまたはメソッドを作成する必要があります。

関連する記事


posted by lightbox at 2014-05-22 23:53 | Java | このブログの読者になる | 更新情報をチェックする

2014年05月17日


Eclipse+WindowBuilder : DBアプリケーション(社員マスタメンテ)の入力チェック

private class UpdateAction extends AbstractAction の全体ソース

入力チェックは、エラー処理も含めて『画面のあるアプリケーション』の仕様の中核となるものです(入力チェック・画面編集・更新処理が中核)

その中でも最も実装が多くなる事が予想されるのが入力チェックで、マスタメンテのような単純な一つの表に対する更新ではあまり他の関連性をチェックする事はありませんが、システムとして整合性を保つ為や、使用するユーザが迷う事無く作業を完了させるために必要な重要な機能となります。

ここでの処理のシナリオとしては、更新ボタンをクリックした直後に入力チェックを一つづつ行い、エラーがあると認識できたらメッセージボックスでエラー内容を表示し、そのエラーの起こったフィールドにフォーカスを移動して入力内容を全て選択状態にした後メソッドを抜けます。

全てのチェックを通り抜けないと更新処理は行いません。

社員マスタメンテで通常考えられる入力チェックは以下のようなものです( 実際は複合される可能性があります )
(1) 必須入力チェック
(2) 入力文字数チェック
(3) 数値チェック
(4) 日付チェック
(5) 他テーブル参照チェック
必須入力チェック
			// 必須チェック
			String inputString = null;
			inputString = syainName.getText();
			inputString = inputString.replaceAll(" ", "");	// 漢字スペースを除去
			if ( inputString.trim().equals("") ) {	// スペースを除去してなにも無い場合
				JOptionPane.showMessageDialog(
						contentPane,
						"必須入力です",
						"エラー",
						JOptionPane.ERROR_MESSAGE);
				syainName.setText("");	// 空白文字があっても無いようにする
				syainName.requestFocusInWindow();
				syainName.selectAll();
				return;
			}


入力文字数チェック
			// 文字数チェック
			int len = 0;
			len = (syainName.getText()).length();
			if ( len > 50 ) {
				JOptionPane.showMessageDialog(
						contentPane,
						"文字数が長すぎます",
						"エラー",
						JOptionPane.ERROR_MESSAGE);
				syainName.requestFocusInWindow();
				syainName.selectAll();
				return;
			}


数値チェック
			// 数値チェック
			int num = 0;
			try {
				num = Integer.parseInt(syainSyozoku.getText());
			} catch (Exception ex) {
				num = -1;
			}
			if ( num < 0 ) {
				JOptionPane.showMessageDialog(
						contentPane,
						"正しい数字を入力して下さい",
						"エラー",
						JOptionPane.ERROR_MESSAGE);
				syainSyozoku.requestFocusInWindow();
				syainSyozoku.selectAll();
				return;
			}


日付チェック
			// 日付チェック
			String birth = syainBirth.getText();
			SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd");
			dateFormat.setLenient(false);
			Date date = null;
			try {
				date = dateFormat.parse(birth);
			} catch (Exception ex) {
				date = null;
			}
			if ( date == null ) {
				JOptionPane.showMessageDialog(
						contentPane,
						"日付が正しくありません",
						"エラー",
						JOptionPane.ERROR_MESSAGE);
				syainBirth.requestFocusInWindow();
				syainBirth.selectAll();
				return;
			}


他テーブル参照チェック
			if ( !rdbms.getConnect() ) {
				JOptionPane.showMessageDialog(
						contentPane,
						"データベースに接続できませんでした\nシステム管理者に連絡してください",
						"エラー",
						JOptionPane.ERROR_MESSAGE);
				syainCode.requestFocusInWindow();
				syainCode.selectAll();
				return;
			}
			
			// 参照チェック
			try {
				
				rdbms.stmt = rdbms.con.createStatement();
				String scode = syainSyozoku.getText();
				String query = "";
				query += "select *";
				query += " from コード名称マスタ";
				query += " where コード名称マスタ.区分 = 2";
				query += " and コード  = '" + scode + "'";				
				System.out.println(query);
				rdbms.rset = rdbms.stmt.executeQuery ( query );
				if ( rdbms.rset.next() ) {
					syainSyozokuName.setText(rdbms.rset.getString( "名称" ));
				}
				else {
					JOptionPane.showMessageDialog(
							contentPane,
							"入力したコードは存在しませんでした",
							"エラー",
							JOptionPane.ERROR_MESSAGE);
					syainSyozoku.requestFocusInWindow();
					syainSyozoku.selectAll();
					rdbms.close();
					return;
				}
				
			} catch (Exception ex) {
				ex.printStackTrace();
			}		


関連する記事


posted by lightbox at 2014-05-17 14:09 | Java | このブログの読者になる | 更新情報をチェックする

Eclipse+WindowBuilder : DBアプリケーション(社員マスタメンテ)の二会話画面制御

アプリケーションにおける『会話数』は、ウインドウ数にあたり、2会話目を終了するか、キャンセルしない限り1会話目の結果を変更する事ができないというルールを守る事によって、矛盾の無いデータの処理を行う事が可能になります。

その為に必要な一般的な処理として、1会話目の画面状態の作成、1会話目の画面状態から2会話の画面状態への変更( 画面遷移 )、2会話目の画面に表示されたものを全て消去して初期化する、という3つの処理が必要になりますPassControl クラス
	private class PassControl {

		// 第一会話を使用可能にし、第二会話を使用不能にする
		// フォーカスコントロール
		public void pass1Enable() {
			
			syainCode.setEnabled(true);
			checkButton.setEnabled(true);

			syainName.setEnabled(false);
			syainFuri.setEnabled(false);
			syainSyozoku.setEnabled(false);
			syainSex.setEnabled(false);
			syainKyuyo.setEnabled(false);
			syainTeate.setEnabled(false);
			syainKanri.setEnabled(false);
			syainBirth.setEnabled(false);

			updateButton.setEnabled(false);
			cancelButton.setEnabled(false);
			
			syainCode.selectAll();
			syainCode.requestFocusInWindow();			
		}

		// 第二会話を使用可能にし、第一会話を使用不能にする
		// フォーカスコントロール
		public void pass2Enable() {

			syainCode.setEnabled(false);
			checkButton.setEnabled(false);

			syainName.setEnabled(true);
			syainFuri.setEnabled(true);
			syainSyozoku.setEnabled(true);
			syainSex.setEnabled(true);
			syainKyuyo.setEnabled(true);
			syainTeate.setEnabled(true);
			syainKanri.setEnabled(true);
			syainBirth.setEnabled(true);
			
			updateButton.setEnabled(true);
			cancelButton.setEnabled(true);

			syainName.selectAll();
			syainName.requestFocusInWindow();			
			
		}

		// 第二会話の入力項目をクリアする
		// 選択コントロール
		public void clearDetailes() {
			
			syainSyozokuName.setEditable(false);
			syainSyozokuName.setEnabled(true);
			syainSyozokuName.setFocusable(false);
			syainKanriName.setEditable(false);
			syainKanriName.setEnabled(true);
			syainKanriName.setFocusable(false);

			syainName.setText("");
			syainFuri.setText("");
			syainSyozoku.setText("");
			syainSyozokuName.setText("");
			// コンボボックス非選択
			syainSex.setSelectedIndex(-1);
			syainKyuyo.setText("");
			syainTeate.setText("");
			syainKanri.setText("");
			syainKanriName.setText("");
			syainBirth.setText("");
			
		}

	}

PassControl クラスは、機能をまとめたものであり、メソッドを実行する事が目的なので、private で作成します。( メソッドを3つ作成しても大差はありません )

Eclipse で private クラスを作成するには、手作業で書いたほうが早いですが、一般的なクラス作成のダイアログで『エンクロージング型』にチェックする事で対話的にブロックを作成できます。


ブロックのソース上の位置は、『アウトラインウインドウ』でドラッグして変更できます。

※ インスタンスは、private 変数として定義すると同時に作成しています

初期画面は、passControl.clearDetailes(); と passControl.pass1Enable(); で作成され、キャンセルボタンでも、passControl.clearDetailes(); と passControl.pass1Enable(); が実行されます。社員マスタの内容が表示された時にのみ、passControl.pass2Enable() が実行されます。

その他の画面コントロール

(1) Enter キーを TAB キーと同等に扱い、次のフィールドへの移動に使用する
		addWindowListener(new WindowAdapter() {
			
			@Override
			public void windowOpened(WindowEvent arg0) {
				MainWindow.this.setLocationRelativeTo(null);

				// 接続文字列を作成して、Rdbms のインスタンスを作成
				currentDir = System.getProperty("user.dir");
				String connectionString = "Provider=MSDASQL"
				+ ";Driver={Microsoft Access Driver (*.mdb)}"
				+ ";Dbq=" + currentDir + "\\data\\販売管理C.mdb" + ";";
				rdbms = new Rdbms( connectionString );
				System.out.println(connectionString);
				
				passControl.clearDetailes();
				passControl.pass1Enable();
				
				// Enter キーで次のフォーカスへ移動する
				KeyboardFocusManager focusManager = KeyboardFocusManager.getCurrentKeyboardFocusManager();
				Set<AWTKeyStroke> forwardKeys = new HashSet<AWTKeyStroke>(focusManager.getDefaultFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS));
				forwardKeys.add(KeyStroke.getAWTKeyStroke(KeyEvent.VK_ENTER, 0));
				focusManager.setDefaultFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS, forwardKeys);
			}
		});


(2) 表示用の入力しない JTextField は、setEnabled を使わない
			// 所属名 編集不可
			syainSyozokuName.setEditable(false);
			// 所属名 使用可
			syainSyozokuName.setEnabled(true);
			// 所属名 フォーカスなし
			syainSyozokuName.setFocusable(false);
			// 管理者名 編集不可
			syainKanriName.setEditable(false);
			// 管理者名 使用可
			syainKanriName.setEnabled(true);
			// 管理者名 フォーカスなし
			syainKanriName.setFocusable(false);

setEnabled を使うと、表示内容が見にくい(画面上のコードが disable で内容が見にくいのが解ると思います)ので、編集不可にしてフォーカスが移動しないようにしています。

また、タブオーダーを指定する事ができないので、ボタンの位置を変更しました。




関連する記事


posted by lightbox at 2014-05-17 01:33 | Java | このブログの読者になる | 更新情報をチェックする

2014年05月16日


Eclipse+WindowBuilder : DBアプリケーション(社員マスタメンテ)でDBからSELECT構文で行データを読み出す

Java の本来の getter setter を作成する方法とは少しずれますが、少なくとも Microsoft の言語では一般的に『プロパティ』が使用されます。Microsoft でも実際の中身はメソッド( getter と setter ) ではありますが、public で変数を定義する事によって、処理を一箇所に集約する事は初歩的なアプリケーション作成では有用です。

ここではまず、データベースに接続するクラスを作成し、そのクラスに public なフィールドを定義してデーベース処理を簡潔にしています。

Rdbms.java
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Properties;


public class Rdbms {

	public Connection con = null;
	public Statement stmt = null;
	public ResultSet rset = null;
	
	private String connectionString = null;

	public Rdbms(String connectionString) {
		this.connectionString = connectionString;
	}

	public boolean getConnect() {
		
		boolean connect_result = true;
		String targetDbc = null;
		
		if ( connectionString.substring(0, 3).equals("jdbc") ) {
			targetDbc = "JDBC";
		}
		else {
			targetDbc = "ODBC";
		}

		// *********************************************
		// ODBC 用接続文字列サンプル
		// *********************************************
//		// SQLServer
//		connectionString = "Provider=MSDASQL"
//				+ ";Driver={SQL Server Native Client 11.0}"
//				+ ";SERVER=.\\sqlexpress" + ";DATABASE=lightbox"
//				+ ";UID=sa" + ";PWD=" + pass + ";";
//		// MySQL
//		connectionString = "Provider=MSDASQL"
//				+ ";Driver={MySQL ODBC 5.3 Unicode Driver}"
//				+ ";SERVER=localhost" + ";DATABASE=lightbox"
//				+ ";UID=root" + ";PWD=" + pass + ";Charset=cp932";
//		// MDB
//		connectionString = "Provider=MSDASQL"
//				+ ";Driver={Microsoft Access Driver (*.mdb)}"
//				+ ";Dbq=" + currentDir + "\\data\\販売管理C.mdb" + ";";
//		// Oracle
//		connectionString = "Provider=MSDASQL"
//				+ ";Driver={Oracle in XE}" + ";DBQ=localhost:1521/XE"
//				+ ";UID=lightbox" + ";PWD=" + pass + ";";
//		// PostgreSQL
//		connectionString = "Provider=MSDASQL"
//				+ ";Driver={PostgreSQL ODBC Driver(UNICODE)}"
//				+ ";Servername=localhost" + ";Port=5432"
//				+ ";Database=lightbox" + ";UID=postgres"
//				+ ";PWD=" + pass + ";";
		
		try {
			if (targetDbc.equals("ODBC")) {
				Properties prop = new Properties();
				prop.put("charSet", "MS932");
				con = DriverManager.getConnection("jdbc:odbc:"+connectionString, prop);
			}
			else {
				con = DriverManager.getConnection(connectionString);
				// *********************************************
				// JDBC 用接続文字列サンプル
				// *********************************************
				// MySQL
				// mysql-connector-java-5.1.30-bin.jar
//					con = DriverManager.getConnection("jdbc:mysql://localhost/lightbox?" +
//						"user=root&password="+pass);
				// Oracle
				// ojdbc6.jar
//					con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521/xe","lightbox",pass);
				// SQLServer
				// sqljdbc4.jar
//					String connectionUrl = "jdbc:sqlserver://localhost:1433;" +
//						"databaseName=lightbox;user=sa;password="+pass+";";
//					con = DriverManager.getConnection(connectionUrl);
				// PostgreSQL
				// postgresql-9.3-1100.jdbc4.jar
//					String connectionUrl = "jdbc:postgresql://localhost:5432/lightbox" +
//	 					"?user=postgres&password="+pass+"&charSet=utf-8;";
//					con = DriverManager.getConnection(connectionUrl);
				
			}
			
		} catch (Exception ex) {
			// TODO 
			ex.printStackTrace();
			connect_result = false;
		}
		
		return connect_result;
	}

	public void close() {
		try {
			
			if ( rset != null ) {
				rset.close();
				rset = null;
			}
			
		} catch (Exception ex) {
			ex.printStackTrace();
		}
		
		try {
			
			if ( stmt != null ) {
				stmt.close();
				stmt = null;
			}
			
		} catch (Exception ex) {
			ex.printStackTrace();
		}

		try {
			
			if ( con != null ) {
				con.close();
				con = null;
			}
			
		} catch (Exception ex) {
			ex.printStackTrace();
		}
		
	}
}

コメント部分は他の RDBMS や jdbc ドライバを使ったり、jdbc-odbc ブリッジを使ったりする場合のサンプルとなっており。主たる処理は、DB に接続して con にインスタンスをセットする事と、終了時の処理を close として集約しているところです

このクラスはアプリケーションの初期化時に、対象となる RDBMS の接続文字列を使ってインスタンスを作成します。( ここでは MS Access )
		addWindowListener(new WindowAdapter() {
			
			@Override
			public void windowOpened(WindowEvent arg0) {
				MainWindow.this.setLocationRelativeTo(null);

				// 接続文字列を作成して、Rdbms のインスタンスを作成
				currentDir = System.getProperty("user.dir");
				String connectionString = "Provider=MSDASQL"
				+ ";Driver={Microsoft Access Driver (*.mdb)}"
				+ ";Dbq=" + currentDir + "\\data\\販売管理C.mdb" + ";";
				rdbms = new Rdbms( connectionString );
				System.out.println(connectionString);
			}
		});

後は、DB アクセスの処理開始イベントで接続、読込み、接続解除の処理を行います。

但し、ここではまだアプリケーションとしてユーザとの会話をコントロールする為の処理は実装されておらず、ただ以下のように disable 状態のフィールドに内容が表示されるだけです


	private class CheckAction extends AbstractAction {
		public CheckAction() {
			putValue(NAME, "確認");
			putValue(SHORT_DESCRIPTION, "Some short description");
		}
		public void actionPerformed(ActionEvent e) {
			System.out.println("確認ボタンがクリックされました");
			
			if ( !rdbms.getConnect() ) {
				JOptionPane.showMessageDialog(
						contentPane,
						"データベースに接続できませんでした\nシステム管理者に連絡してください",
						"エラー",
						JOptionPane.ERROR_MESSAGE);
				syainCode.requestFocusInWindow();
				syainCode.selectAll();
				return;
			}
			
			try {
				
				rdbms.stmt = rdbms.con.createStatement();
				String scode = syainCode.getText();
				String query = "";
				query += "select 社員マスタ.*,";
				query += " Format(社員マスタ.生年月日,'yyyy/MM/dd') as 生年月日2,";
				query += " コード名称マスタ.名称,";
				query += " 管理者参照.氏名 as 管理者名";
				query += " from (社員マスタ left join コード名称マスタ on 社員マスタ.所属 = コード名称マスタ.コード)";
				query += " left join 社員マスタ 管理者参照 on 社員マスタ.管理者 = 管理者参照.社員コード";
				query += " where コード名称マスタ.区分 = 2";
				query += " and 社員マスタ.社員コード = '" + scode + "'";				
				System.out.println(query);
				rdbms.rset = rdbms.stmt.executeQuery ( query );
				if ( rdbms.rset.next() ) {
					syainName.setText(rdbms.rset.getString( "氏名" ));
					syainFuri.setText(rdbms.rset.getString( "フリガナ" ));
					syainSyozoku.setText(rdbms.rset.getString( "所属" ));
					syainSyozokuName.setText(rdbms.rset.getString( "名称" ));
					syainSex.setSelectedIndex(rdbms.rset.getInt("性別"));
					syainKyuyo.setText(rdbms.rset.getString( "給与" ));
					syainTeate.setText(rdbms.rset.getString( "手当" ));
					syainKanri.setText(rdbms.rset.getString( "管理者" ));
					syainKanriName.setText(rdbms.rset.getString( "管理者名" ));
					syainBirth.setText(rdbms.rset.getString( "生年月日2" ));
					
				}
				else {
					JOptionPane.showMessageDialog(
							contentPane,
							"入力したコードは存在しませんでした",
							"エラー",
							JOptionPane.ERROR_MESSAGE);
					syainCode.requestFocusInWindow();
					syainCode.selectAll();
					rdbms.close();
					return;
				}
				
			} catch (Exception ex) {
				ex.printStackTrace();
			}				
			
			rdbms.close();
		}
	}

データベースは、販売管理C.MDB です。以下からダウンロードできます


Eclipse のプロジェクト内に data フォルダを作成してその中に置いて、パッケージエクスプローラから F5 で再表示すると以下のようになるはずです。



SELECT 構文について

ここで使用している SELECT 構文は、left join を二回行って、二つの他の表と結合しています。そのうちの一つは『コード名称マスタ』という、比較的件数の少ないシステム上のコード定義を行っているテーブルです。このテーブルの主キーは、区分とコードと言う二つの列から成り立っており、社員マスタの所属と、区分2 の行のコード部分が結合されます。

もう一つの結合する表は社員マスタであり、このような結合は『自己結合』と呼ばれます。この場合は、社員マスタに対して別名を定義し、(ここでは 管理者参照 )、かつ全ての列に対してテーブル名の修飾を行って一意な列名として参照するようにしています。

日付の編集を行っている関数は、MS Access のものです。この部分は RDBMS 毎に記述が変わるので注意して下さい。
select 社員マスタ.*
	, Format(社員マスタ.生年月日,'yyyy/MM/dd') as 生年月日2
	, コード名称マスタ.名称
	, 管理者参照.氏名 as 管理者名 
 from 
	(社員マスタ left join コード名称マスタ on 社員マスタ.所属 = コード名称マスタ.コード)
	left join 社員マスタ 管理者参照 on 社員マスタ.管理者 = 管理者参照.社員コード 
 where コード名称マスタ.区分 = 2 
   and 社員マスタ.社員コード = '0006'

関連する記事


posted by lightbox at 2014-05-16 20:14 | Java | このブログの読者になる | 更新情報をチェックする

Eclipse+WindowBuilder : ボタンイベント(AbstractAction) の作成



ボタンコントールの右クリックで表示される、Add event handler や、Design 上でボタンをダブルクリックして作成されるイベントコードは、『匿名のインナー型』と呼ばれる無名の処理のブロックとなります。当然ソースの記述位置は、ホタンの定義の近くに自動的に作成されるので、アプリケーションの簡単な振る舞いを定義するには便利でメンテナンス性も良いですが、アプリケーションにとって重大で大きなアクションを定義するのは向いていません。処理記述が大きくなれば、当然コンストラクタの記述を圧迫してメンテナンス性が全く無くなってしまいます。

そういった場合は、本来 public なクラスを作成して別のソースコードとして管理するものですが、WindowBuilder では最終的にそうする為の予備コーディングとして『アクションの設定』というメニューがあります



これを行うと、別のソースコードでは無く private なクラスとしての AbstractAction を自動的に作成してくれます。これによって作成されたアクションは、後から呼び出しの変更先として自由に Design 画面から各コントロールのイベントとして選択する事ができるようになります。



但し、自動的に作成されるので変数名は変更したほうが良いです。プロパティウインドウから変更する事によって、ソース上で使われているその変数名が全て変更されます。さらに、変数名だけでは無くクラス名そのものも変更して、処理の意味を明確にしておくべきでしょう。



クラス名の変更は、パッケージエクスプローラの該当するクラスを選択して、F2 キーで名前変更用のダイアログが表示されます。そして、最後にボタンのテキストを変更する為に、ソースコードの putValue の中身を変更しておきます。



こうする事によって、比較的管理しやすいソースコードとしてイベント記述を書く事ができるようになります。



※ putValue で、SHORT_DESCRIPTION に対して文字列を設定すると、ヒントウインドウの内容がその内容になります。
	private class CheckAction extends AbstractAction {
		public CheckAction() {
			putValue(NAME, "確認");
			putValue(SHORT_DESCRIPTION, "Some short description");
		}
		public void actionPerformed(ActionEvent e) {
			System.out.println("確認ボタンがクリックされました");
		}
	}



関連する記事


posted by lightbox at 2014-05-16 15:25 | Java | このブログの読者になる | 更新情報をチェックする

2014年05月15日


Eclipse+WindowBuilder : データベースアプリケーション(社員マスタメンテ)の画面作成

Eclipse と WindowBuilder の機能を使ってできるだけ簡単にデータベースアプリケーションを作成します。『社員マスタメンテ』は、主キーが一つでシステム稼動の為に最初から必要な『マスターテーブル』の一つとして想定しています。本来は、『登録・修正・削除・一覧印刷』の機能を持つべきですが、ここでは一つのアプリケーションに一つの機能という事で簡潔にする為、『修正』のみに限定します。

データベースは、特別な環境を構築せずに使える MS Access( MDB ) を使用します。Java の接続を変更すれば、若干の SQL 変更で Oracle でも動作します。( 今回この記事では SQL を使用していませんが )
関連する記事

JDBC と ODBC を使った、オールマイティなデータベース接続サンプル
MDB で使用する社員マスタの CERATE 文は以下のようになります
create table [社員マスタ] (
	[社員コード] VARCHAR(4)
	,[氏名] VARCHAR(50)
	,[フリガナ] VARCHAR(50)
	,[所属] VARCHAR(4)
	,[性別] INT
	,[作成日] DATETIME
	,[更新日] DATETIME
	,[給与] INT
	,[手当] INT
	,[管理者] VARCHAR(4)
	,[生年月日] DATETIME
	,primary key([社員コード])
)

社員マスタを含んだ MDB ファイル(販売管理C.MDB)は以下からダウンロードできます


アプリケーション作成で最初に行うのは画面作成です。単純なレイアウトであれば、場合によっては、設計時に既に作成されている可能性もあります。ただ、ここではアプリケーションの基本機能として、いくつかの設定が必要になります。

その最も大きなものは『2会話処理』を前提とした、2会話目のコントロールの Disable 設定です。WindowBuilder では、Design のプロパティから設定できますが、結局はコードとなってコンストラクタで実行されます。

ですが、その前に JFrame を使った WindowBuilder のプロジェクトを作成する必要があります

WindowBuilder JFrame アプリケーションプロジェクト (1)

ワークスペースと Javaプロジェクト



何をするにも、ワークスペースと Javaプロジェクトは必要です。他からプロジェクトをインポートする場合にも、Eclipse 側でプロジェクトが必要です。


WindowBuilder JFrame アプリケーションプロジェクト (2)

JFrame クラスの作成と、JPanel の絶対レイアウト



JFrame の中に JPanel が作成され、JFrame がいわゆる Window の役目をします。JPanel は、コントロールのコンテナとして機能しますが、初期状態では『絶対レイアウト』にならないので、その設定までが基本操作になります


画面作成

以下のような画面を作成して、コードに入力した値に対応する社員のデータを更新する処理です。



コードと確認ボタンは第一会話グループで、初期状態として入力可能となります。それ以外は全て第二会話グループとなり、確認ボタンでエラーがなければ、第一会話グループを入力不可に変更して、第二会話グループの入力を可能にします。その際(第二会話グループへの移行直後)、初期フォーカスは氏名となります



第二会話グループを選択すると、共通となるプロパティが表示されるので、その中の enabled のチェックが外れた状態にします。

それ以外の調整も必要ですが、以下のソースコードをそのまま使用すると、WindowBuilder が Design に同じものを表示してくれます
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.EventQueue;

import javax.swing.DefaultComboBoxModel;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.border.EmptyBorder;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;


public class MainWindow extends JFrame {

	private JPanel contentPane;
	private JTextField syainCode;
	private JTextField syainName;
	private JTextField syainFuri;
	private JTextField syainSyozoku;
	private JTextField syainSyozokuName;
	private JComboBox<String> syainSex;
	private JTextField syainKyuyo;
	private JTextField syainTeate;
	private JTextField syainKanri;
	private JTextField syainKanriName;
	private JTextField syainBirth;
	private JButton checkButton;
	private JButton updateButton;
	private JButton cancelButton;

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					MainWindow frame = new MainWindow();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the frame.
	 */
	public MainWindow() {
		addWindowListener(new WindowAdapter() {
			@Override
			public void windowOpened(WindowEvent arg0) {
				MainWindow.this.setLocationRelativeTo(null);
			}
		});
		setResizable(false);
		setTitle("\u793E\u54E1\u30DE\u30B9\u30BF\u30E1\u30F3\u30C6");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 468, 331);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(null);
		
		syainCode = new JTextField();
		syainCode.setBounds(98, 29, 50, 19);
		contentPane.add(syainCode);
		syainCode.setColumns(10);
		
		syainName = new JTextField();
		syainName.setEnabled(false);
		syainName.setColumns(10);
		syainName.setBounds(98, 85, 202, 19);
		contentPane.add(syainName);
		
		syainFuri = new JTextField();
		syainFuri.setEnabled(false);
		syainFuri.setColumns(10);
		syainFuri.setBounds(98, 108, 202, 19);
		contentPane.add(syainFuri);
		
		syainSyozoku = new JTextField();
		syainSyozoku.setEnabled(false);
		syainSyozoku.setColumns(10);
		syainSyozoku.setBounds(98, 131, 42, 19);
		contentPane.add(syainSyozoku);
		
		syainSyozokuName = new JTextField();
		syainSyozokuName.setEditable(false);
		syainSyozokuName.setEnabled(false);
		syainSyozokuName.setColumns(10);
		syainSyozokuName.setBounds(153, 131, 147, 19);
		contentPane.add(syainSyozokuName);
		
		syainSex = new JComboBox<String>();
		syainSex.setEnabled(false);
		syainSex.setModel(new DefaultComboBoxModel<String>(new String[] {"\u7537\u6027", "\u5973\u6027"}));
		syainSex.setBounds(98, 154, 80, 19);
		contentPane.add(syainSex);
		
		syainKyuyo = new JTextField();
		syainKyuyo.setEnabled(false);
		syainKyuyo.setColumns(10);
		syainKyuyo.setBounds(98, 177, 96, 19);
		contentPane.add(syainKyuyo);
		
		syainTeate = new JTextField();
		syainTeate.setEnabled(false);
		syainTeate.setColumns(10);
		syainTeate.setBounds(98, 200, 96, 19);
		contentPane.add(syainTeate);
		
		syainKanri = new JTextField();
		syainKanri.setEnabled(false);
		syainKanri.setColumns(10);
		syainKanri.setBounds(98, 223, 42, 19);
		contentPane.add(syainKanri);
		
		syainKanriName = new JTextField();
		syainKanriName.setEditable(false);
		syainKanriName.setEnabled(false);
		syainKanriName.setColumns(10);
		syainKanriName.setBounds(153, 223, 147, 19);
		contentPane.add(syainKanriName);
		
		syainBirth = new JTextField();
		syainBirth.setEnabled(false);
		syainBirth.setColumns(10);
		syainBirth.setBounds(98, 246, 82, 19);
		contentPane.add(syainBirth);
		
		checkButton = new JButton("\u78BA\u8A8D");
		checkButton.setBounds(333, 28, 106, 21);
		contentPane.add(checkButton);
		
		updateButton = new JButton("\u66F4\u65B0");
		updateButton.setEnabled(false);
		updateButton.setBounds(333, 209, 106, 21);
		contentPane.add(updateButton);
		
		cancelButton = new JButton("\u30AD\u30E3\u30F3\u30BB\u30EB");
		cancelButton.setEnabled(false);
		cancelButton.setBounds(333, 247, 106, 21);
		contentPane.add(cancelButton);
		
		JLabel label = new JLabel("\u30B3\u30FC\u30C9");
		label.setBounds(31, 32, 67, 13);
		contentPane.add(label);
		
		JLabel label_1 = new JLabel("\u6C0F\u540D");
		label_1.setBounds(31, 88, 67, 13);
		contentPane.add(label_1);
		
		JLabel label_2 = new JLabel("\u30D5\u30EA\u30AC\u30CA");
		label_2.setBounds(31, 111, 67, 13);
		contentPane.add(label_2);
		
		JLabel label_3 = new JLabel("\u751F\u5E74\u6708\u65E5");
		label_3.setBounds(31, 249, 67, 13);
		contentPane.add(label_3);
		
		JLabel label_4 = new JLabel("\u6240\u5C5E");
		label_4.setBounds(31, 134, 67, 13);
		contentPane.add(label_4);
		
		JLabel label_5 = new JLabel("\u6027\u5225");
		label_5.setBounds(31, 157, 67, 13);
		contentPane.add(label_5);
		
		JLabel label_6 = new JLabel("\u7D66\u4E0E");
		label_6.setBounds(31, 180, 67, 13);
		contentPane.add(label_6);
		
		Component label_7 = new JLabel("\u624B\u5F53");
		label_7.setBounds(31, 203, 67, 13);
		contentPane.add(label_7);
		
		JLabel label_8 = new JLabel("\u7BA1\u7406\u8005");
		label_8.setBounds(31, 226, 67, 13);
		contentPane.add(label_8);	
	}

}

その他の設定

■ windowOpened イベントを追加し、表示ウインドウを中央に表示する
※ public void setLocationRelativeTo(Component c)
■ JFrame のタイトル文字列を設定する。
※ public void setTitle(String title)
■ ウインドウ枠のサイズ変更をできないようにする
※ public void setResizable(boolean resizable)
■ JLabel をローカル変数として定義し、それ以外は フィールドとして定義する

▼ このアイコンで、ローカルとフィールドの切り替えができます

※ 但し、ローカルから参照されているフィールドは、ローカルには戻せません


変数名の変更と、変数の定義位置の変更



プロパティウインドウの Variable プロパティを変更すると、ソース上で使用されている変数名が自動的に全て変更されます。デフォルトでは、WindowBuilder が作成するので、後からシステムの命名規則を元に変更するといいと思います。整理の為に、変数の順序もコンポーネントウインドウでドラッグする事によって変更可能です。

クラス名の変更

パッケージエクスプローラで選択して F2 キーで変更用のウインドウが表示されます


※ 選択して、右クリックの『リファクタリング』の中にもあります

コントロールの複製

ある程度プロパティを変更したものをそのまま複製したい場合は、デザイン画面上で選択して、CTRL+C から CTRL + V を実行すると、プロパティの複製されたコントロールを貼り付ける事のできるカーソルに変化します。
( ESC で解除 )


関連する記事


posted by lightbox at 2014-05-15 23:15 | Java | このブログの読者になる | 更新情報をチェックする

2014年05月10日


Eclipse + WindowBuilder : JDBC と ODBC を使った、オールマイティなデータベース接続サンプル( MySQL / SQLServer / Oracle / Postgres / MS Access)

2014/05/10
■ 更新処理を追加
■ キャンセル処理を追加
■ MDB を同梱( 初期選択を ODBC + MS Access )
■ 変数名整備、その他ユーザインターフェイスの基本機能を装備
インポートは、Java プロジェクトを作成して、src フォルダの一つ上位のフォルダを選択します。( 最初にクリーンして、WindowBuilder でメインソースを選択して、Design タブを開きます ) 前提条件 ワークスペースのキャラクタセットが UTF-8 である事 ( Eclipse.ini に、-Dfile.encoding=utf-8 を設定すると常にワークスペースが UTF-8 になります ) キャラクタセットについて 細かい話をすると、RDBMS 単位に実装が違うので、サンプルの内容で解ると思いますが、基本的には JDBC で接続する場合は特に意識する必要無く接続できると思います。ソースを UTF-8 にしているのは、Pleiades の日本語化で、Java のドキュメントも日本語化されますが、それを正しく見るために UTF-8 である必要があるからです。 ODBC 接続は少しやっかいで、古い アプリケーションが内部コードを持たずにそのまま SHIFT_JIS で作成されている場合でも正しく接続できるように設計しているので、UTF-8 環境から実行する場合いろいろ RDBMS 毎に設定が違ったりしますが、JDBC-ODBC ブリッジ の場合、キャラクタセットのパラメータが拡張で用意されているので、たいていはそれで調整されます( ソースを見ていただくと、RDBMS 側の設定が必要な例外があるのが解ると思いますが ) JLabel2 と JButton2 について これは、コントロールのフォントをプロパティから変更するのが面倒な理由で作成したものです。WindowBuilder のパレットに単純に追加してもダメだったので実装はフォントのみです。 いろいろやっているうちに、WindowBuilder のコンポーネントとしてインポートしても存在できるようになりました。 結局、JButton2 と JLable2 の設定がプロパティの初期値として反映されています( 内容を変更した後は一旦終了しないとうまくいかないような気もします )。コンポーネントの追加は、Custom category を右クリックすると可能ですが( Add Component )、Custom category を定義する為の『org.eclipse.wb.swing.wbp-palette.xml』は、WindowBuilder の以下のツールで雛形を作成します( Swing toolkit ) これで作成すると、フォルダを作成して自動的にファイルも作成してくれます。但し、内容はあくまでサンプルなので、自分のクラスとして書き換える必要があります。そして、正しく書き換えてから、右クリックの Add Component で実際のクラスを登録します。 さらに詳細はこちらの PDF に記述されています その他 更新ボタンの内容は実装していません。アクションの切り替えを WindowBuilder からできるので、テストの為に枠組みのみ実装しています。 2014/05/10 : 更新処理を追加しました 関連する重要な記事 Eclipse + WindowBuilder : Design タブが表示されなくなった時の対処 コンポーネントのテキスト定義部分はこのソースでは日本語になっていますが、実際は 『\u793E\u54E1\u540D』というような Unicode の 16進表現になります。( ソースとして解りにくいので書き換えてあります )
// import は省略しています

public class Main extends JFrame {

	private JPanel contentPane;
	private JTextField codeData;
	private JTextField nameData;
	private JTextField txtPassword;
	private final Action actionCheck = new SwingActionCheck();
	private final Action actionUpdate = new SwingActionUpdate();
	private JComboBox<String> jdbc_odbc;
	private JComboBox<String> rdbms;
	
	private String currentDir = null;
	private JButton2 check_button;
	private JButton2 update_button;
	private JButton2 cance_button;
	private final Action actionCancel = new SwingActionCancel();

	private Connection con = null;
	private Statement stmt = null;
	private ResultSet rset = null;
	
	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		try {
			UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
		} catch (Throwable e) {
			e.printStackTrace();
		}
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					Main frame = new Main();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the frame.
	 */
	public Main() {
		
		// Enter キーで次のフォーカスへ移動する
		KeyboardFocusManager focusManager = KeyboardFocusManager.getCurrentKeyboardFocusManager();
		Set<AWTKeyStroke> forwardKeys = new HashSet<AWTKeyStroke>(focusManager.getDefaultFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS));
		forwardKeys.add(KeyStroke.getAWTKeyStroke(KeyEvent.VK_ENTER, 0));
		focusManager.setDefaultFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS, forwardKeys);
			
		addWindowListener(new WindowAdapter() {
			@Override
			public void windowActivated(WindowEvent arg0) {
				// ウインドウを中央に
				Main.this.setLocationRelativeTo(null);
				
				// 初期コンボボックスの内容
				rdbms.setModel(new DefaultComboBoxModel<String>(new String[]
						{"MySQL", "Oracle", "SQLServer", "MS Access", "Postgres"}));
				// MS Access を選択
				rdbms.setSelectedIndex(3);
				
				// フォーカスを入力フィールドに
				codeData.requestFocusInWindow();
				
				currentDir = System.getProperty("user.dir");
				System.out.println("プロジェクトのフォルダ : " + currentDir);				
			}
		});
		setTitle("JDBC / ODBC / \u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u63A5\u7D9A\u30B5\u30F3\u30D7\u30EB");
		setResizable(false);
		
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 450, 300);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(null);
		
		codeData = new JTextField();
		codeData.addFocusListener(new FocusAdapter() {
			// フォーカスを失った時に入力内容を編集する
			@Override
			public void focusLost(FocusEvent arg0) {
				String save_string;
				String edited_string;
				try {
					edited_string = String.format("%04d", Integer.parseInt(codeData.getText()) );
					codeData.setText(edited_string);
				} catch (NumberFormatException e) {
					//e.printStackTrace();
				}
			}
		});
		codeData.setBounds(107, 71, 68, 19);
		contentPane.add(codeData);
		codeData.setColumns(10);
		
		nameData = new JTextField();
		nameData.setEnabled(false);
		nameData.setBounds(107, 124, 270, 19);
		contentPane.add(nameData);
		nameData.setColumns(10);
		
		check_button = new JButton2();
		check_button.setAction(actionCheck);
		check_button.setText("確認");
		check_button.setBounds(201, 68, 69, 27);
		contentPane.add(check_button);
		
		update_button = new JButton2();
		update_button.setAction(actionUpdate);
		update_button.setEnabled(false);
		update_button.setText("更新");
		update_button.setBounds(280, 188, 96, 27);
		contentPane.add(update_button);
		
		cance_button = new JButton2();
		cance_button.setAction(actionCancel);
		cance_button.setText("\u30AD\u30E3\u30F3\u30BB\u30EB");
		cance_button.setEnabled(false);
		cance_button.setBounds(280, 225, 96, 27);
		contentPane.add(cance_button);
		
		jdbc_odbc = new JComboBox<String>();
		jdbc_odbc.addPopupMenuListener(new PopupMenuListener() {
			public void popupMenuCanceled(PopupMenuEvent arg0) {
			}
			public void popupMenuWillBecomeInvisible(PopupMenuEvent arg0) {
				rdbms.setSelectedIndex(-1);
			}
			public void popupMenuWillBecomeVisible(PopupMenuEvent arg0) {
			}
		});
		jdbc_odbc.setModel(new DefaultComboBoxModel<String>(new String[] {"JDBC", "ODBC"}));
		jdbc_odbc.setSelectedIndex(1);
		jdbc_odbc.setBounds(29, 27, 83, 19);
		contentPane.add(jdbc_odbc);
		
		rdbms = new JComboBox<String>();
		rdbms.addPopupMenuListener(new PopupMenuListener() {
			public void popupMenuCanceled(PopupMenuEvent arg0) {
			}
			public void popupMenuWillBecomeInvisible(PopupMenuEvent arg0) {
			}
			// コンボボックスを開いた時に発生するイベント
			public void popupMenuWillBecomeVisible(PopupMenuEvent arg0) {
				rdbms.removeAllItems();
				if (jdbc_odbc.getSelectedItem().equals("JDBC")){
					// JDBC では、MS Access は存在しない
					rdbms.setModel(new DefaultComboBoxModel<String>(new String[]
							{"MySQL", "Oracle", "SQLServer",  "Postgres"}));
				}
				if (jdbc_odbc.getSelectedItem().equals("ODBC")){
					rdbms.setModel(new DefaultComboBoxModel<String>(new String[]
							{"MySQL", "Oracle", "SQLServer", "MS Access", "Postgres"}));
				}
			}
		});
		rdbms.setBounds(124, 27, 110, 19);
		contentPane.add(rdbms);
		{
			txtPassword = new JTextField();
			txtPassword.setText("password");
			txtPassword.setBounds(336, 27, 96, 19);
			contentPane.add(txtPassword);
			txtPassword.setColumns(10);
		}
		
		JLabel2 label2_0 = new JLabel2();
		label2_0.setText("パスワード");
		label2_0.setBounds(265, 28, 68, 19);
		contentPane.add(label2_0);
		
		JLabel2 label2_1 = new JLabel2();
		label2_1.setText("コード");
		label2_1.setBounds(29, 72, 52, 19);
		contentPane.add(label2_1);
		
		JLabel2 label2_2 = new JLabel2();
		label2_2.setText("社員名");
		label2_2.setBounds(29, 125, 52, 19);
		contentPane.add(label2_2);
	}

	// 会話用 ボタンアクション 1
	private class SwingActionCheck extends AbstractAction {
		public SwingActionCheck() {
			putValue(NAME, "確認");
			putValue(SHORT_DESCRIPTION, "社員コードを入力して下さい");
		}

		public void actionPerformed(ActionEvent e) {
		
			getConnect();
			
			try {
				
				stmt = con.createStatement();
				String scode = codeData.getText();
				rset = stmt.executeQuery ( "select * from 社員マスタ where 社員コード = '" + scode + "'" );
				if ( rset.next() ) {
					nameData.setText(rset.getString( "氏名" ));
					
					update_button.setEnabled(true);
					nameData.setEnabled(true);
					cance_button.setEnabled(true);
					
					check_button.setEnabled(false);
					codeData.setEnabled(false);
					jdbc_odbc.setEnabled(false);
					rdbms.setEnabled(false);
					txtPassword.setEnabled(false);
					
					nameData.requestFocusInWindow();
					nameData.selectAll();
					
				}
				else {
					JOptionPane.showMessageDialog(contentPane, "入力した社員コードは存在しません");
					codeData.requestFocusInWindow();
					codeData.selectAll();
				}
				
				rset.close();
				stmt.close();
				con.close();
				
			} catch (Exception e1) {
				// TODO 
				e1.printStackTrace();
			}
			
		}

	}
	
	private boolean getConnect() {
		
		boolean connect_result = true;
		
		String pass = txtPassword.getText();
		
		// TODO 自動生成されたメソッド・スタブ
		// JDBC か ODBC か
		String targetDbc = (String)jdbc_odbc.getSelectedItem();
		String targetRdbms = (String)rdbms.getSelectedItem();

		
		String connectionString = "";

		// *********************************************
		// ODBC 用接続文字列
		// *********************************************

		if (targetDbc.equals("ODBC")) {
			if (targetRdbms.equals("SQLServer")) {
				// SQLServer
				connectionString = "Provider=MSDASQL"
						+ ";Driver={SQL Server Native Client 11.0}"
						+ ";SERVER=.\\sqlexpress" + ";DATABASE=lightbox"
						+ ";UID=sa" + ";PWD=" + pass + ";";
			}
			if (targetRdbms.equals("MySQL")) {
				// MySQL
				connectionString = "Provider=MSDASQL"
						+ ";Driver={MySQL ODBC 5.3 Unicode Driver}"
						+ ";SERVER=localhost" + ";DATABASE=lightbox"
						+ ";UID=root" + ";PWD=" + pass + ";Charset=cp932";
			}
			if (targetRdbms.equals("MS Access")) {
				// MDB
				connectionString = "Provider=MSDASQL"
						+ ";Driver={Microsoft Access Driver (*.mdb)}"
						+ ";Dbq=" + currentDir + "\\data\\販売管理C.mdb" + ";";
			}
			if (targetRdbms.equals("Oracle")) {
				// Oracle
				connectionString = "Provider=MSDASQL"
						+ ";Driver={Oracle in XE}" + ";DBQ=localhost:1521/XE"
						+ ";UID=lightbox" + ";PWD=" + pass + ";";
			}
			if (targetRdbms.equals("Postgres")) {
				// PostgreSQL
				connectionString = "Provider=MSDASQL"
						+ ";Driver={PostgreSQL ODBC Driver(UNICODE)}"
						+ ";Servername=localhost" + ";Port=5432"
						+ ";Database=lightbox" + ";UID=postgres"
						+ ";PWD=" + pass + ";";
			}
		}
		
		try {
			if (targetDbc.equals("ODBC")) {
				Properties prop = new Properties();
				prop.put("charSet", "MS932");
				System.out.println(connectionString);
				con = DriverManager.getConnection("jdbc:odbc:"+connectionString, prop);
			}
			else {

				// *********************************************
				// JDBC 用接続文字列
				// *********************************************
				
				if (targetRdbms.equals("MySQL")) {
					// MySQL
					// mysql-connector-java-5.1.30-bin.jar
					con = DriverManager.getConnection("jdbc:mysql://localhost/lightbox?" +
						"user=root&password="+pass);
				}

				if (targetRdbms.equals("Oracle")) {
					// Oracle
					// ojdbc6.jar
					con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521/xe","lightbox",pass);
				}
				
				if (targetRdbms.equals("SQLServer")) {
					// SQLServer
					// sqljdbc4.jar
					String connectionUrl = "jdbc:sqlserver://localhost:1433;" +
						"databaseName=lightbox;user=sa;password="+pass+";";
					con = DriverManager.getConnection(connectionUrl);
				}

				if (targetRdbms.equals("PostgreSQL")) {
					// PostgreSQL
					// postgresql-9.3-1100.jdbc4.jar
					String connectionUrl = "jdbc:postgresql://localhost:5432/lightbox" +
	 					"?user=postgres&password="+pass+"&charSet=utf-8;";
					con = DriverManager.getConnection(connectionUrl);
				}
				
			}
			
		} catch (Exception e1) {
			// TODO 
			e1.printStackTrace();
			connect_result = false;
		}
		
		return false;
	}
	
	// 会話用 ボタンアクション 2
	private class SwingActionUpdate extends AbstractAction {
		public SwingActionUpdate() {
			putValue(NAME, "更新");
			putValue(SHORT_DESCRIPTION, "Some short description");
		}
		public void actionPerformed(ActionEvent e) {
			
			int result = JOptionPane.showConfirmDialog(contentPane, "更新してよろしいですか?", "更新確認", JOptionPane.OK_CANCEL_OPTION);
			if ( result == JOptionPane.CANCEL_OPTION) {
				return;
			}

			getConnect();
			
			try {
				
				stmt = con.createStatement();
				String scode = codeData.getText();
				String sname = nameData.getText();
				String sql = "update 社員マスタ set 氏名 = '" + sname + "' where 社員コード = '" + scode + "'";
				result = stmt.executeUpdate(sql);
				
				actionCancel.actionPerformed(null);
				
				stmt.close();
				con.close();
				
				JOptionPane.showMessageDialog(contentPane, "更新処理が実行されました");
				
				
			} catch (Exception e1) {
				// TODO 
				e1.printStackTrace();
			}
			
			
		}
	}
	private class SwingActionCancel extends AbstractAction {
		public SwingActionCancel() {
			putValue(NAME, "キャンセル");
			putValue(SHORT_DESCRIPTION, "Some short description");
		}
		public void actionPerformed(ActionEvent e) {
			
			update_button.setEnabled(false);
			nameData.setEnabled(false);
			cance_button.setEnabled(false);
			
			check_button.setEnabled(true);
			codeData.setEnabled(true);
			jdbc_odbc.setEnabled(true);
			rdbms.setEnabled(true);
			txtPassword.setEnabled(true);
			
			nameData.setText("");
			
			codeData.requestFocusInWindow();
			codeData.selectAll();
			
		}
	}
}



関連する記事


posted by lightbox at 2014-05-10 22:37 | Java | このブログの読者になる | 更新情報をチェックする

2014年05月05日


Eclipse + WindowBuilder : Design タブが表示されなくなった時の対処

原因は解りませんが、Eclipse がソースを標準のエディタで開いてしまっている事が原因なので、専用の WindowBuilder エディタで開き直すことで元に戻ります。同時に二つのエディタを使え無いので、いったん標準のエディタで開いたタブを閉じて、以下の位置より開きなおして下さい。



これについては、Eclipse の英文の FAQ で記述があります。

WindowBuilder Pro FAQ

上記リンク先に、メニューがあるので『What can I do if I don't see the Design tab when I edit a window?』をクリックします

Eclipse remembers the last editor type used with a file. If you don't see the Design tab, that means that you are using the standard Eclipse Java Editor rather than the WindowBuilder Editor. Open the file with the WindowBuilder Editor and you will see both the Source and Design tabs. Note that Eclipse will only let you have a file open with one editor at a time, so you may need to close any existing editor before opening it with the WindowBuilder Editor.
関連する記事


posted by lightbox at 2014-05-05 00:40 | Java | このブログの読者になる | 更新情報をチェックする

2014年05月03日


Eclipse を正しく使う為に

Eclipse と言えば、Pleiades ですが、Android もできるので、ADT をダウンロードして、Pleiades の日本語化プロラグインをインストールするのが良いです。

ADT( Android Development Tools ) Eclipse の導入



さらに、Windows Builder もインストールすればたいていの事ができるようになります。

ADT( Android Development Tools ) Eclipse に Window Builder をインストールして Swing アプリケーションを作成する(1)
ADT( Android Development Tools ) Eclipse に Window Builder をインストールして Swing アプリケーションを作成する(2)


Eclipse のキャラクタセット

Pleiades の日本語化プロラグインをインストールすると、Javadoc ホバーが日本語化されます。



しかし、これは UTF-8 での日本語化なので、Eclipse の環境として日本語は MS932 にデフォルトが設定されている為、設定変更しないと化けてしまいます。そこで、Eclipse でプロジェクトを作成した時に最初から UTF-8 にしておく方法として、Eclipse.ini に、-Dfile.encoding=utf-8 を設定するのですが、このパラメータは、Java VM に渡すシステムプロパティで、java のコマンドラインでもこう記述があります。

    -D=
                  システム・プロパティを設定する
Eclipse の本来のマニュアルは英文で複雑ですが、同様の記述があります。 Eclipse runtime options 実際、Java を使って一覧を取得してみると以下のようになります。( これは設定後の一覧です )
import java.util.Iterator;
import java.util.Properties;
import java.util.TreeMap;

public class Main {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO 自動生成されたメソッド・スタブ
		
		Properties p = System.getProperties();
		TreeMap<Object,Object> tm = new TreeMap<Object, Object>(p);
		Iterator<Object> it = tm.keySet().iterator();

		// 一覧表示
		while(it.hasNext())
		{

			Object key = it.next();
			Object value = tm.get(key);

			System.out.print(key+" : ");
			System.out.println(value);

		}		

	}

}



行番号を最初から表示する / 空白文字列を表示する

Eclipse.ini を以下のように設定し、plugin_customization.ini を作成して初期値を書き込みます。
-startup
plugins/org.eclipse.equinox.launcher_1.3.0.v20120522-1813.jar
--launcher.library
plugins/org.eclipse.equinox.launcher.win32.win32.x86_1.1.200.v20120913-144807
-product
com.android.ide.eclipse.adt.package.product
--launcher.XXMaxPermSize
256M
-showsplash
com.android.ide.eclipse.adt.package.product
--launcher.XXMaxPermSize
256m
--launcher.defaultAction
openFile
-pluginCustomization
plugin_customization.ini
-vmargs
-Dosgi.requiredJavaVersion=1.6
-Xms40m
-Xmx768m
-Declipse.buildId=v22.2.1-833290
-javaagent:plugins/jp.sourceforge.mergedoc.pleiades/pleiades.jar
-Dfile.encoding=utf-8
▼ plugin_customization.ini( Eclipse.ini と同じフォルダ)
org.eclipse.ui.editors/lineNumberRuler=true
org.eclipse.ui.editors/showWhitespaceCharacters=true
Eclipse.ini の設定後は、Pleiades の日本語化プラグインで使用した『eclipse.exe -clean.cmd』でEclipse を起動させます。 関連する記事


posted by lightbox at 2014-05-03 22:21 | Java | このブログの読者になる | 更新情報をチェックする
Seesaa の各ページの表示について
Seesaa の 記事がたまに全く表示されない場合があります。その場合は、設定> 詳細設定> ブログ設定 で 最新の情報に更新の『実行ボタン』で記事やアーカイブが最新にビルドされます。

Seesaa のページで、アーカイブとタグページは要注意です。タグページはコンテンツが全く無い状態になりますし、アーカイブページも歯抜けページはコンテンツが存在しないのにページが表示されてしまいます。

また、カテゴリページもそういう意味では完全ではありません。『カテゴリID-番号』というフォーマットで表示されるページですが、実際存在するより大きな番号でも表示されてしまいます。

※ インデックスページのみ、実際の記事数を超えたページを指定しても最後のページが表示されるようです

対処としては、このようなヘルプ的な情報を固定でページの最後に表示するようにするといいでしょう。具体的には、メインの記事コンテンツの下に『自由形式』を追加し、アーカイブとカテゴリページでのみ表示するように設定し、コンテンツを用意するといいと思います。


※ エキスパートモードで表示しています

アーカイブとカテゴリページはこのように簡単に設定できますが、タグページは HTML 設定を直接変更して、以下の『タグページでのみ表示される内容』の記述方法で設定する必要があります

<% if:page_name eq 'archive' -%>
アーカイブページでのみ表示される内容
<% /if %>

<% if:page_name eq 'category' -%>
カテゴリページでのみ表示される内容
<% /if %>

<% if:page_name eq 'tag' -%>
タグページでのみ表示される内容
<% /if %>
この記述は、以下の場所で使用します


Windows
container 終わり

フリーフォントで簡単ロゴ作成
フリーフォントでボタン素材作成
フリーフォントで吹き出し画像作成
フリーフォントではんこ画像作成
ほぼ自由に利用できるフリーフォント
フリーフォントの書体見本とサンプル
画像を大きく見る為のウインドウを開くボタンの作成

Android SDK ポケットリファレンス
改訂版 Webデザイナーのための jQuery入門
今すぐ使えるかんたん ホームページ HTML&CSS入門
CSS ドロップシャドウの参考デモ
PHP正規表現チェッカー
Google Hosted Libraries
cdnjs
BUTTONS (CSS でボタン)
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり