バイナリデータを渡す Web サービス (パート 6): Swing クライアントの作成
サンプルのダウンロード
ここでの目標は、すでに作成、配備した Web サービスのクライアントを作成し、そのクライアントに GUI インタフェースを追加することです。このインタフェースには、Web サービスがバイナリデータとして渡すイメージが表示されます。
チュートリアルの内容
概要
EJB モジュールの作成
Web サービスの作成
Web サービスのテスト
バイナリデータを渡すためのスキーマと WSDL ファイルの変更
=> Swing クライアントの作成
Web サービスのログ作成および最適化
Swing クライアントの作成
次の手順では、Web アプリケーションを作成します。このアプリケーション内で、前のチュートリアルで作成および変更した Web サービスを使用するクライアントを作成します。次に、JFrame を Web アプリケーションに追加し、その中で Swing コンポーネントを使用して GUI インタフェースをデザインします。最後に、Swing コンポーネントを Web サービスクライアントコードにバインドします。
Swing クライアントを作成するには、次の手順に従います。
「ファイル」>「新規プロジェクト」(Ctrl-Shift-N) を選択します。「新規プロジェクト」ウィザードが表示さます。「Java」カテゴリから「Java アプリケーション」を選択します。「次へ」をクリックします。「新規 Java アプリケーション」ウィザードが表示されます。「プロジェクト名」に「FlowerClient 」と入力し、「完了」をクリックします。IDE により新しい Java アプリケーションプロジェクトが作成されます。
「FlowerClient 」プロジェクトノードを右クリックし、コンテキストメニューから「新規」>「Web サービスクライアント」を選択します。「新規 Web サービスクライアント」ウィザードが開きます。「WSDL URL」ラジオボタンを選択し、WSDL ファイルの URL をそのフィールドにペーストします。デフォルトでは、URL は http://localhost:8080/FlowerService/FlowerService?WSDL です。「完了」をクリックします。IDE により WSDL ファイルがダウンロードされ、Web サービスと対話するためのクライアントスタブが追加され、次に示すように Java アプリケーションプロジェクトの「プロジェクト」ウィンドウにノードが追加されます。
「FlowerClient 」ノードを右クリックし、「新規」>「JFrame」を選択します。フレームに「FlowerFrame 」という名前を付けます。
FlowerFrame に JPanel を追加します。FlowerFrame 全体を埋めるように拡げます。パネルに「gardenFlowersPanel 」という名前を付けます。
次の Swing コンポーネントを gardenFlowersPanel に追加します。パネルの一番上から始めます。(Swing コンポーネントのチュートリアルについては、「NetBeans IDE での Swing GUI のデザイン 」を参照。)
ラベル。 変数名: titleLabel 、テキスト: Garden Flowers 、位置: 中央の上。テキストはボールドにするか、フォントサイズを大きくするか、またはその両方を適用できます。
ボタングループ。 変数名: buttonGroup1 。
次の 4 つのラジオボタンを titleLabel の下の水平行に追加します。各ボタンのプロパティーで、buttonGroup1 のメンバーとして設定します。
buttonGroup1 のラジオボタン
asterRadioButton
true
Aster
honeysuckleRadioButton
false
Honeysuckle
roseRadioButton
false
Rose
sunflowerRadioButton
false
Sunflower
JScrollPane。 変数名: mainScrollPane 。位置: ラジオボタンの下。水平スペースと、残りの垂直スペースの約 2/3 を埋める。
JPanel。 変数名: mainPanel 。レイアウト: ボーダー。位置: mainScrollPane を埋める。
JButton。 変数名: mainPictureButton 。テキスト: Waiting for picture... 。位置: mainPanel 内 (パネルのボーダーレイアウトにより、ボタンは自動的にスペース全体を埋める)。
JScrollPane。 変数名: thumbnailScrollPane 。位置: ラジオボタンの下。水平スペースと、残りのすべての垂直スペースを埋める。
JPanel。 変数名: thumbnailPanel 。レイアウト: グリッド。位置: thumbnailScrollPane を埋める。「グリッド」レイアウトとは、次の 4 つのボタンすべてが同じサイズになり、thumbnailPanel を埋めることを意味します。
thumbnailPanel のボタン
asterButton
Waiting...
honeysuckleButton
Waiting...
roseButton
Waiting
sunflowerButton
Waiting...
この段階で、FlowerFrame は次のように表示されるはずです。
ソースエディタで、次のように FlowerFrame を初期化します。
ソースエディタで、次のように FlowerFrame を初期化します。
public static final String[] FLOWERS = {"aster", "honeysuckle", "rose", "sunflower"};
private Map<String, Image> flowers;
public FlowerFrame(Map<String, Image> flowers) {
this.flowers = flowers;
for (String flower:FLOWERS) {
flowers.put(flower,null);
}
initComponents();
setTitle("Garden Flowers [waiting for picture]");
ItemListener rbListener = new RBListener();
asterRadiobutton.addItemListener(rbListener);
honeysuckleRadiobutton.addItemListener(rbListener);
roseRadiobutton.addItemListener(rbListener);
sunflowerRadiobutton.addItemListener(rbListener);
ActionListener bListener = new ButtonListener();
asterButton.addActionListener(bListener);
honeysuckleButton.addActionListener(bListener);
roseButton.addActionListener(bListener);
sunflowerButton.addActionListener(bListener);
}
JRadioButton がクリックされたら、新しいイメージをメインボタンに表示するようにします。
private class RBListener implements ItemListener {
public void itemStateChanged(ItemEvent e) {
showFlower();
}
}
void showFlower() {
Image img = null;
if (asterRadiobutton.isSelected()) {
img = flowers.get("aster");
if (img != null) {
mainPictureButton.setIcon(new ImageIcon(img));
setTitle("Garden Flowers [Aster]");
}
} else if (honeysuckleRadiobutton.isSelected()) {
img = flowers.get("honeysuckle");
if (img != null) {
mainPictureButton.setIcon(new ImageIcon(img));
setTitle("Garden Flowers [Honeysuckle]");
}
} else if (roseRadiobutton.isSelected()) {
img = flowers.get("rose");
if (img != null) {
mainPictureButton.setIcon(new ImageIcon(img));
setTitle("Garden Flowers [Rose]");
}
} else if (sunflowerRadiobutton.isSelected()) {
img = flowers.get("sunflower");
if (img != null) {
mainPictureButton.setIcon(new ImageIcon(img));
setTitle("Garden Flowers [Sunflower]");
}
}
if (img == null) {
mainPictureButton.setIcon(null);
setTitle("Garden Flowers [waiting for picture]");
} else mainPictureButton.setText("");
}
JButton がクリックされたら、関連する JRadioButton を選択します。
private class ButtonListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
if (e.getSource() == asterButton) asterRadiobutton.setSelected(true);
else if (e.getSource() == honeysuckleButton) honeysuckleRadiobutton.setSelected(true);
else if (e.getSource() == roseButton) roseRadiobutton.setSelected(true);
else if (e.getSource() == sunflowerButton) sunflowerRadiobutton.setSelected(true);
}
}
Main クラスで FlowerFrame の setThumbnails メソッドが呼び出されます。
void setThumbnails(Map<String, Image> thumbs) {
Image img = thumbs.get("aster");
if (img != null) {
asterButton.setIcon(new ImageIcon(img));
asterButton.setText("");
}
img = thumbs.get("honeysuckle");
if (img != null) {
honeysuckleButton.setIcon(new ImageIcon(img));
honeysuckleButton.setText("");
}
img = thumbs.get("rose");
if (img != null) {
roseButton.setIcon(new ImageIcon(img));
roseButton.setText("");
}
img = thumbs.get("sunflower");
if (img != null) {
sunflowerButton.setIcon(new ImageIcon(img));
sunflowerButton.setText("");
}
}
FlowerFrame でインポートを修正します。
次のように Main.java クラスを記述します。
public class Main {
private static int downloadedPictures;
public static void main(String[] args) {
final Map<String,Image> flowers = new HashMap<String,Image>(4);
final Map<String,Image> thumbs = new HashMap<String,Image>(4);
// FlowerFrame を表示
final FlowerFrame frame = new FlowerFrame(flowers);
frame.setVisible(true);
// クライアントがこのコードでサービスに接続
FlowerService_Service service = new FlowerService_Service();
final FlowerService port = service.getFlowerServicePort();
Runnable[] tasks = new Runnable[4];
// Web サービス getFlower オペレーション
// が、それぞれ別のスレッドで 4 回呼び出される。
// 操作が完了すると図が
// 特定のボタンに表示される。
for (int i=0; i<4;i++) {
final int index = i;
tasks[i] = new Runnable() {
public void run() {
try {
// getFlower オペレーションを Web サービス
// で呼び出す:
Image img = port.getFlower(FlowerFrame.FLOWERS[index]);
System.out.println("picture downloaded: "+FlowerFrame.FLOWERS[index]);
// Hashmap に文字列を追加する
flowers.put(FlowerFrame.FLOWERS[index],img);
// FlowerFrame の showFlower オペレーション
// を呼び出す
frame.showFlower();
} catch (IOException_Exception ex) {
ex.printStackTrace();
}
downloadedPictures++;
}
};
new Thread(tasks[i]).start();
}
// 前の 4 つのスレッドが終了した直後に Web サービス
// getThumbnails オペレーションが別個のスレッドで呼び出される。
// イメージがダウンロードされるとサムネイルが
// フレームのいちばん下に表示される。
Runnable thumbsTask = new Runnable() {
public void run() {
try {
while (downloadedPictures < 4) {
try {Thread.sleep(100);} catch (InterruptedException ex) {}
}
// Web サービスで getThumbnails オペレーション
// を呼び出す
List<Image> images = port.getThumbnails();
System.out.println("thumbs downloaded");
if (images != null && images.size() == 4) {
for (int i=0;i<4;i++) {
thumbs.put(FlowerFrame.FLOWERS[i],images.get(i));
}
frame.setThumbnails(thumbs);
}
} catch (IOException_Exception ex) {
ex.printStackTrace();
}
}
};
new Thread(thumbsTask).start();
}
}
Main.java でインポートを修正します。
FlowerFrame クラスの既存の main メソッドを削除します。
これで Web サービスは完了です。EJB モジュールに委譲してそのイメージを公開する Web サービスと対話するコードを作成しました。クライアントを右クリックし、「実行」を選択します。Swing アプリケーションが起動し、しばらくすると Web サービスから受信されるイメージが表示されます。
次の手順:
サービスのログ作成および最適化
nbj2ee
@
netbeans.org
メーリングリスト に登録することによって、NetBeans IDE Java EE 開発機能に関するご意見やご提案を送信したり、サポートを受けたり、最新の開発情報を入手したりできます。