SQLの窓

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 で解除 )


関連する記事


【Javaの最新記事】
posted by lightbox at 2014-05-15 23:15 | Java | このブログの読者になる | 更新情報をチェックする
container 終わり



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

CSS ドロップシャドウの参考デモ
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり