FeaturesPluginsDocs & SupportCommunityPartners

バイナリデータを渡す Web サービス (パート 6): Swing クライアントの作成

サンプルのダウンロード

ここでの目標は、すでに作成、配備した Web サービスのクライアントを作成し、そのクライアントに GUI インタフェースを追加することです。このインタフェースには、Web サービスがバイナリデータとして渡すイメージが表示されます。

チュートリアルの内容

このページの内容は NetBeans IDE 6.1 が対象です
  1. 概要
  2. EJB モジュールの作成
  3. Web サービスの作成
  4. Web サービスのテスト
  5. バイナリデータを渡すためのスキーマと WSDL ファイルの変更
  6. => Swing クライアントの作成
  7. Web サービスのログ作成および最適化

Swing クライアントの作成

次の手順では、Web アプリケーションを作成します。このアプリケーション内で、前のチュートリアルで作成および変更した Web サービスを使用するクライアントを作成します。次に、JFrame を Web アプリケーションに追加し、その中で Swing コンポーネントを使用して GUI インタフェースをデザインします。最後に、Swing コンポーネントを Web サービスクライアントコードにバインドします。

Swing クライアントを作成するには、次の手順に従います。

  1. 「ファイル」>「新規プロジェクト」(Ctrl-Shift-N) を選択します。「新規プロジェクト」ウィザードが表示さます。「Java」カテゴリから「Java アプリケーション」を選択します。「次へ」をクリックします。「新規 Java アプリケーション」ウィザードが表示されます。「プロジェクト名」に「FlowerClient」と入力し、「完了」をクリックします。IDE により新しい Java アプリケーションプロジェクトが作成されます。
  2. FlowerClient」プロジェクトノードを右クリックし、コンテキストメニューから「新規」>「Web サービスクライアント」を選択します。「新規 Web サービスクライアント」ウィザードが開きます。「WSDL URL」ラジオボタンを選択し、WSDL ファイルの URL をそのフィールドにペーストします。デフォルトでは、URL は http://localhost:8080/FlowerService/FlowerService?WSDL です。「完了」をクリックします。IDE により WSDL ファイルがダウンロードされ、Web サービスと対話するためのクライアントスタブが追加され、次に示すように Java アプリケーションプロジェクトの「プロジェクト」ウィンドウにノードが追加されます。


    新しい Web サービスクライアントが表示された「プロジェクト」ビュー

  3. FlowerClient」ノードを右クリックし、「新規」>「JFrame」を選択します。フレームに「FlowerFrame」という名前を付けます。
  4. FlowerFrame に JPanel を追加します。FlowerFrame 全体を埋めるように拡げます。パネルに「gardenFlowersPanel」という名前を付けます。
  5. 次の 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 は次のように表示されるはずです。
    イメージの代わりにボタンのテキストが表示された、完了した Flower Frame

  6. ソースエディタで、次のように FlowerFrame を初期化します。
  7. ソースエディタで、次のように 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);
    
                } 
  8. 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("");
                }
  9. 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);
        }
                }
  10. Main クラスで FlowerFramesetThumbnails メソッドが呼び出されます。
    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("");
        }
                }
  11. FlowerFrame でインポートを修正します。
  12. 次のように 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();
        }
    
                }
  13. Main.java でインポートを修正します。
  14. FlowerFrame クラスの既存の main メソッドを削除します。

これで Web サービスは完了です。EJB モジュールに委譲してそのイメージを公開する Web サービスと対話するコードを作成しました。クライアントを右クリックし、「実行」を選択します。Swing アプリケーションが起動し、しばらくすると Web サービスから受信されるイメージが表示されます。

次の手順:

サービスのログ作成および最適化

メーリングリストに登録することによって、NetBeans IDE Java EE 開発機能に関するご意見やご提案を送信したり、サポートを受けたり、最新の開発情報を入手したりできます。

Companion
Projects:
MySQL Database Server   Open JDK: an Open SourceJDK   GlassFish Community: an Open Source Application Server    Mobile & Embedded Community    Open Solaris   java.net - The Source for Java Technology Collaboration   Virtual Box - full virtualizer  Open ESB - The Open Enterprise Service Bus Powered by