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); }