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();
}
}
}
関連する記事
|
|
【Javaの最新記事】
- Java : Apache POI で最低限の処理を標準化( ここではワークブックは新規作成 )
- Java で JSON 文字列を オブジェクトに変換する Google Gson の基本 4 パターン
- Java のコンソールで NAVER の RSS を取得して、title 部分を正規表現で加工して表示するサンプル
- Eclipse で、文字列内のファイルのパスの \ 記号を \\ にする方法
- Java : Google gson 2.3.1 で JSON 文字列を定義済みのクラスを使ってオブジェクト化
- Java : Google gson 2.3.1 で、JSON 文字列のフォーマットが解らなくてもなんとかなる『ベタ』な処理方法
- Eclipse のホバーで追加したライブラリの javadoc を表示させる手順
- Eclipse+WindowBuilder : DBアプリケーション(社員マスタメンテ)の更新(データ修正)処理
- Eclipse+WindowBuilder : DBアプリケーション(社員マスタメンテ)の入力チェック
- Eclipse+WindowBuilder : DBアプリケーション(社員マスタメンテ)の二会話画面制御
- Eclipse+WindowBuilder : DBアプリケーション(社員マスタメンテ)でDBからSELECT構文で行データを読み出す
- Eclipse+WindowBuilder : ボタンイベント(AbstractAction) の作成
- Eclipse+WindowBuilder : データベースアプリケーション(社員マスタメンテ)の画面作成
- Eclipse + WindowBuilder : Design タブが表示されなくなった時の対処
- Eclipse のパンくずリスト(breadcrumb) をワークスペースの設定ファイルで非表示にする
- Java : Eclipse 実行の System.in.read(buff) でコンソール入力
- iText( itextpdf-5.4.3 / Java ) で簡単に PDF 出力をする。
- SQL 文へのデータバインド用 public class GetSQL
- ADT( Android Development Tools ) Eclipse に Window Builder をインストールして Swing アプリケーションを作成する(2)
- Java : Windows の環境変数の列挙( 含ソート )



結局、JButton2 と JLable2 の設定がプロパティの初期値として反映されています( 内容を変更した後は一旦終了しないとうまくいかないような気もします )。コンポーネントの追加は、Custom category を右クリックすると可能ですが( Add Component )、Custom category を定義する為の『org.eclipse.wb.swing.wbp-palette.xml』は、WindowBuilder の以下のツールで雛形を作成します( Swing toolkit )
これで作成すると、フォルダを作成して自動的にファイルも作成してくれます。但し、内容はあくまでサンプルなので、自分のクラスとして書き換える必要があります。そして、正しく書き換えてから、右クリックの Add Component で実際のクラスを登録します。
関連する重要な記事




