書籍購入履歴を永続化する(2)
書籍のデータを入力する部分を実装する。
バーコード読み取りには、上記のエフケイシステム社製バーコードリーダCCD-TSK-USB(スペック)を用いる。バーコードリーダの価格差異が機能や性能に対してどういった影響を及ぼすのかは調査していない。USB接続ができ、Amazonで最安値付近で購入できるものを選択した結果である。
このバーコードリーダは有線であるため、本目的で利用するには、作業場所とPCの位置が離れていないことが条件となる。なお、前述スペック表では、ケーブル長は1.75mとなっている。
書籍バーコード値(上段)入力フィールドの実装
まず、フォーカス遷移制御コードを追加する。このバーコードリーダは、読み取りボタンを押すと、読み取った値と改行を出力する(初期設定の場合)。従って、書籍バーコード値(上段)を入力し、エンターを押すと書籍バーコード値(下段)入力欄にフォーカスを遷移させるようコードを編集する。
- BookRecorderView.javaをデザインモードで開き、uppercodeFieldを右クリック「イベント」>「Key」>「keyPressed」を選択する。
- 自動生成されたメソッドに、以下のコードを追加する。
if (KeyEvent.VK_ENTER == evt.getKeyCode()) {
lowercodeField.requestFocusInWindow();
}
また、ISBN(上段)値が確定した際に、Amazonから書籍名を取得するコードを追加する。これにはHttpClient4を用いる。そのため、プロジェクトにHttpClientライブラリを追加しておく。
Amazonで検索を行うには、以下のURLへアクセスすればよいようだ。これは、Firefox3の右上検索窓で利用されているコード"C:\Program Files\Mozilla Firefox 3\searchplugins\amazon-jp.xml"から類推できる。
http://www.amazon.co.jp/exec/obidos/external-search/?field-keywords=[検索文字列]
また、書籍名はbtAsinTitleタグに設定されているようなので、このタグに囲まれている文字列を書籍名として抽出するようにする。これらの処理をまとめてAmazon.javaに実装した。
結果として、以下のようなコードになる。
private void uppercodeFieldKeyPressed(java.awt.event.KeyEvent evt) {
if (KeyEvent.VK_ENTER == evt.getKeyCode()) {
String name = "";
try {
name = Amazon.getInstance().getName(uppercodeField.getText());
} catch (Exception ex) {
Logger.getLogger(Book.class.getName()).log(Level.SEVERE, null, ex);
}
nameField.setText(name);
lowercodeField.requestFocusInWindow();
}
}
書籍バーコード値(下段)入力フィールドの実装
ここでエンターを押すと、レコードの確定と、次のレコードへの入力準備が必要になる。つまり、新しいレコードを作成し、書籍バーコード値(上段)入力フィールドにフォーカスを遷移させればよい。
private void lowercodeFieldKeyPressed(java.awt.event.KeyEvent evt) {
if (KeyEvent.VK_ENTER == evt.getKeyCode()) {
newRecord();
uppercodeField.requestFocusInWindow();
}
}
その他、本来であればcommitも行ってしまってよいと考えたが、Saveボタンを押下した際に実行されるであろうコード
@Action(enabledProperty = "saveNeeded")
public Task save() {
return new SaveTask(getApplication());
}
の意味が理解できていないので、今回はパスした。このため、終了前にSaveボタンを押し忘れると入力したデータが全て消えてしまう。この対策として、終了確認ダイアログを出すことにした(参考)。
Swing Application Frameworkで作成したウィンドウで終了イベントを取得するには、addExitListenerメソッドでリスナを設定すればよいようだ。ここでは、BookRecorderViewクラスにExitListenerインタフェースを実装し、コンストラクタでリスナを追加するコードを記述した。
public class BookRecorderView extends FrameView implements ExitListener {
public BookRecorderView(SingleFrameApplication app) {
super(app);
initComponents();
getApplication().addExitListener(this);
(中略)
public boolean canExit(EventObject arg0) {
if(!isSaveNeeded()){
return true;
}
int result = JOptionPane.showConfirmDialog(this.getComponent(), "Saveボタンを押していない場合、入力値は保存されません。" + "\n終了しますか?",
"終了確認",
JOptionPane.YES_NO_OPTION);
if (result == JOptionPane.YES_OPTION) {
return true;
}
return false;
}
public void willExit(EventObject arg0) {
}
以上で前回エントリ冒頭に記載したゴールに到達した。
« 書籍消費履歴を永続化する | トップページ | 本棚の整理 »
この記事へのコメントは終了しました。
コメント