はじめに
QRコードはバーコードとは異なり、数字や英字だけでなくひらがなや漢字も情報に含めることができます。しかも、格納できる情報量(文字数)も大変多いので、氏名や住所・メールアドレスなどを一括してQRコード化できます。
このQRコードを上手に活用すると、名刺やパンフレット、請求書などに連絡先などをQRコード化して貼り付け、携帯電話のバーコードリーダーなどで手軽に読み込んで使用できる機能を組み込むことも可能です。
そこで、今回はJBarCode 2.5JのQRコード作成機能で、氏名とメールアドレス、コメントをQRコード化するJavaアプリケーションを作成してみました。
対象読者
- Java、Swingコンポーネント、Eclipseを使って、Servlet・Applet・スタンドアロンアプリケーションを作ったことのある人
必要な環境
- 32bitバージョンJavaVM、JDK 1.4.2/5.0/6.0
- 64bitバージョンJavaVM(Sun製Windows x64 VMのみサポート)、JDK 5.0/6.0
- Eclipse3.0以降
なお、本プログラムは次の環境で作成し、動作確認を行っています。
- Windows Vista Service Pack2
- jdk1.6.0_05
- Eclipse 3.1.1
コンポーネントのインストール
はじめてJBarCode 2.5Jを使用する方は、使用しているコンピュータにJBarCode 2.5Jをインストールする必要があります。
インストーラは、グレープシティのWebページからダウンロードできます。製製品ページの[申込フォーム]をクリックし、グレープシティのWebサイトへ必要情報を登録すると、添付トライアルライセンスキーファイルとダウンロードサイトを記載したE-Mailが送られてきますので、ここからダウンロードします。ファイルはLZH形式で圧縮されており、解凍してインストーラを起動します。
制限事項などの詳細については、インストーラに同梱されているリリースノートを参照ください。
サンプルコードの実行について
本稿のサンプルアプリケーションを実行させるには、次の方法があります。
- サンプルファイルをEclipseのプロジェクトにインポートする
- プロジェクトのプロパティを開き、[Javaのビルド・パス]を選んで[ライブラリー]タブをクリックし、既に登録されている「jbarcode.jar」を削除する
- [外部JARの追加]ボタンを押して、サンプルファイルに同梱してある「jbarcode.jar」ファイルを選択する
- プロパティウィンドウを閉じて、Eclipseの実行ボタンを押す
QRコードについて
バーコードが横方向にしか情報を持てないのに対し、QRコードは縦横に情報を持つことができます。そのため、格納できる情報量がバーコードに比べて格段に多く、かつ英数字だけでなくひらがなや漢字のデータも格納できるメリットがあります。
よく目にするWebサイトのURL情報をQRコードにしているものも、この利点を生かしている例の1つです。また、携帯電話のアプリケーションには、アドレス帳の住所・氏名などの情報をQRコードに変換するものもあります。
そこで今回は、氏名・メールアドレス・コメントを入力し、JBarCode 2.5JでまとめてQRコードに変換して、PNGフォーマットの画像データに保存するJavaアプリケーションを作成しました。
数字のみ | 最大7,089文字 |
英数(US-ASCII) | 最大4,296文字 |
バイナリ(8ビット) | 最大2,953バイト |
漢字・かな(Shift+JIS) | 最大1,817文字 |
作成するプログラムとGUI
GUIは、Java swingコンポーネントを使用したGUIアプリケーションとし、3つのデータ入力フィールドとQRコード作成ボタン、および作成したQRコードを画像ファイルとして保存するためのボタンを持つようにします。
各swingコンポーネントは、フレームに2つのパネルを配置し、レイアウトマネージャを使用してそれぞれのパネルに配置します。左側のパネルは、くぼんだ枠線を設定します。
GUIのレイアウト作成
前回同様Eclipseを使い、Javaのスタンドアロンアプリケーションとして作成します。プロジェクトは、通常のJavaアプリケーションを作成するプロジェクトを用意します。このとき、ライブラリーにJBarCode 2.5JのJARファイルを指定しておきます。プロジェクト名およびクラス名は「myjbarcode2」です。手順は、次のようになります。
- 新規Javaプロジェクト作成の2番目の画面で、[ライブラリー]タブをクリックし、[外部JARの追加]ボタンを押します。
- JBarCode 2.5Jをインストールしたフォルダの中にある「lib」フォルダの「jbarcode.jar」ファイルを指定します。これで、JBarCode 2.5Jをプロジェクトで使用できるようになります。
作成するクラス「jbarcode2」では、swingパッケージをインポートするとともに、JBarCodeコンポーネントが使えるよう、2つのパッケージをインポートします。また、QRコード作成と保存にボタンのイベント処理を利用するので、イベント関係のパッケージもインポートします。
mainメソッドでフレームのセットアップをします。ここでは、パネル「JPanel」から派生させたクラス「qrcodePanel」のコンストラクタでGUIのレイアウトを行うので、このパネルをフレームに組み込んでおきます。
import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import com.grapecity.barcode.BarCode; import com.grapecity.barcode.valuetype.*; public class jbarcode2 { public static void main(String[] args) { //Frame のセットアップ JFrame frame = new JFrame("jbarcode"); barcodePanel mainpanel = new barcodePanel(); Container cont = frame.getContentPane(); cont.add(mainpanel); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setBounds(0, 0, 400, 200); frame.setVisible(true); } }
クラス「qrcodePanel」のコンストラクタの作成
クラス「qrcodePanel」のコンストラクタでは、GUIを作成する処理を実行します。
GUIの図でも示したように、2つのパネルを横に並べ、その中にラベル、テキストフィールド、ボタンを配置します。各パネルにはレイアウトマネージャを使用して、それぞれのコンポーネントを配置します。また、パネルpanel1だけは、setBorderメソッドを使用して枠線を設定します。QRコードもこのコンストラクタの中で作成しますが、データの設定がないままQRコードを作成し、後でデータを設定する、という方法をとります。
setTypeメソッドの引数に、Typeクラスのメンバフィールド「QRCode」を設定してQRコードを生成するようにします。2つのボタンはイベント処理を使用するので、イベントリスナーを設定しておきます。
class qrcodePanel extends JPanel implements ActionListener{ JButton button1,button2; JTextField txt1, txt2, txt3; JLabel label1, label2, label3; JPanel panel1, panel2; BarCode qrcode; String data = "紺帆産業(株) 販売促進課 課長補佐:"; String fname = ""; private static final long serialVersionUID = 1L; qrcodePanel() { panel1 = new JPanel(); panel2 = new JPanel(); button1 = new JButton("作成"); button1.setForeground(Color.BLUE); button1.addActionListener(this); button2 = new JButton("保存"); button2.setForeground(Color.RED); button2.addActionListener(this); label1 = new JLabel("氏名"); label2 = new JLabel("メールアドレス"); label3 = new JLabel("コメント"); txt1 = new JTextField("", 20); txt2 = new JTextField("", 20); txt3 = new JTextField("", 20); //パネルのレイアウト panel1.setBorder(BorderFactory.createLoweredBevelBorder()); panel1.setLayout(new GridLayout(7,1)); panel1.add(label1); panel1.add(txt1); panel1.add(label2); panel1.add(txt2); panel1.add(label3); panel1.add(txt3); panel1.add(button1); //QRコードの作成-データは空のまま qrcode = new BarCode(); qrcode.setType(Type.QRCode); qrcode.setBarSize(new BarSize("100px, 100px")); panel2.setLayout(new FlowLayout()); panel2.add(qrcode); panel2.add(button2); this.setLayout(new GridLayout(1,2)); this.add(panel1); this.add(panel2); }
QRコード生成機能の作成
テキストフィールドのデータ入力を受けて、QRコードを生成する処理をクラスのメソッド「actionPerformed」に作成します。
まず、メソッドの引数「ActionEvent el」のgetSourceメソッドを使用して、イベントが発生したボタンの種類を判別し、「button1」が押されたときにQRコードにデータをセットする処理を実行するようにします。
public void actionPerformed(ActionEvent el) { if(el.getSource() == button1){ if(txt1.getText().isEmpty()){ JOptionPane.showMessageDialog(null, "氏名を入力してください", "警告", JOptionPane.INFORMATION_MESSAGE); }else{ data += txt1.getText() + txt2.getText() + txt3.getText(); //QRコード作成 qrcode.setValue(data); } }
既にBarCodeオブジェクトが作成されている時に、setValueメソッドの引数に新しい値を設定してメソッドを実行すると、それまで作成されていたQRコードの画像が新しいデータのQRコードに自動的に入れ替わります。
QRコードの保存処理
もう1つのボタンbutton2(保存)のイベント処理では、生成したQRコードをPNGフォーマットの画像で保存します。これは、BarCodeクラスのsaveImageメソッドを使用します。オーバーロードメソッドなので、引数にファイル名と画像フォーマットを指定するメソッドを使用することにします。
ファイル名は、「氏名」欄に入力された値を使用し、フォーマットにBarCodeクラスのフィールド「PNG」を指定します。なお、ファイル操作を行えるため、例外処理を組み込む必要があるので注意してください。
ここでは、氏名欄が空白だとファイル名を作成できないので、その場合は簡単なメッセージボックスを表示して注意を促すことと、ファイル作成ができない場合のメッセージ表示を組み込んでいます。
if(el.getSource() == button2){ try{ if(txt1.getText().isEmpty()){ JOptionPane.showMessageDialog(null, "氏名を入力してください", "警告", JOptionPane.INFORMATION_MESSAGE); }else{ fname = txt1.getText() + "PNG"; qrcode.saveImage(fname, BarCode.PNG); } }catch(Exception e){ JOptionPane.showMessageDialog(null, "データを書き込めません", "保存", JOptionPane.INFORMATION_MESSAGE); } } }
これで生成したQRコードを画像ファイルとして使うことができます。後は、この画像を名刺やパンフレットなどに組み込んで印刷すればできあがりです。
まとめ
WebサイトのURL表示などで一般的になってきているQRコードですが、仮名漢字が使えることと多くの文字数が使えるので、今後はさまざまな情報表示のシンボルとして、いろいろな分野で幅広く使われて行くのではないでしょうか。
これだけ多くの情報を小さな図形にまとめることができるQRコードは、アイデア次第でいろいろな活用法が生まれてくると思います。そんな時、このJBarCode 2.5Jはバーコード作成アプリケーションの開発に大きな威力を発揮するコンポーネントだと思います。