corner imagecorner image
FeaturesPluginsDocs & SupportCommunityPartners

Передача двоичных данных с помощью приложения веб-службы, часть 6: создание клиента Swing

Загрузка примера

Цель этого упражнения состоит в создании клиента веб-службы, которая была создана и развернута ранее, с последующим добавлением к этому клиенту графического интерфейса. Интерфейс служит для вывода на экран изображений, переданных веб-службой в виде двоичных данных.

Руководства этой учебной карты

Содержимое на этой странице относится к среде IDE NetBeans 6.1
  1. Обзор
  2. Создание модуля EJB
  3. Создание веб-службы
  4. Тестирование веб-службы
  5. Изменение файлов схемы и WSDL для передачи двоичных файлов
  6. => Создание клиента Swing
  7. Протоколирование и оптимизация веб-службы

Создание клиента Swing

Ниже приведена процедура создания веб-приложения. Внутри этого приложения создается клиент, потребляющий веб-службу, которая была создана и изменена в предыдущих руководствах. Затем к веб-приложению добавляется JFrame, и внутри него с помощью элементов Swing разрабатывается интерфейс GUI. Наконец, выполняется связывание элементов Swing с кодом клиента веб-службы.

Создание клиента Swing:

  1. Выберите "File > New Project" (Ctrl-Shift-N). Откроется мастер создания проекта. Выберите "Java Application" в категории "Java". Нажмите кнопку "Next". Откроется мастер "New Java Application". Введите FlowerClient в текстовом поле "Project Name" и нажмите кнопку "Finish". В результате создается новый проект приложения на Java.
  2. Щелкните правой кнопкой мыши узел проекта FlowerClient и выберите в контекстном меню "New > Web Service Client". Откроется мастер "New Web Service Client". Выберите переключатель "WSDL URL" и вставьте в соответствующее поле URL-адрес файла WSDL. URL-адрес по умолчанию – http://localhost:8080/FlowerService/FlowerService?WSDL. Нажмите кнопку "Finish". Файл WSDL загружается в IDE, в него добавляются клиентские заглушки для взаимодействия с веб-службой, а к окну "Projects" в проекте приложения на Java добавляются узлы, как показано ниже:


    Окно "Projects" с новым клиентом веб-службы

  3. Щелкните правой кнопкой мыши узел FlowerClient и выберите "New > JFrame". Присвойте фрейму имя FlowerFrame.
  4. Добавьте панель JPanel к FlowerFrame. Разверните ее на весь размер FlowerFrame. Присвойте панели имя gardenFlowersPanel.
  5. Добавьте на панель gardenFlowersPanel следующие элементы Swing, начиная сверху. (См. руководство по элементам Swing: Проектирование графического интерфейса Swing в среде IDE NetBeans):
    • Label. имя переменной: titleLabel, текст: Garden Flowers, положение: центровка сверху. Текст можно выделить полужирным шрифтом или увеличить размер шрифта.
    • ButtonGroup. имя переменной: buttonGroup1.
    • Добавьте следующие 4 переключателя в горизонтальный ряд под меткой titleLabel. В свойствах каждой кнопки укажите членство в группе buttonGroup1. Переключатели в buttonGroup1
      Имя переменной Selected Text
      asterRadioButton true Aster
      honeysuckleRadioButton false Honeysuckle
      roseRadioButton false Rose
      sunflowerRadioButton false Sunflower
    • JScrollPane. имя переменной: mainScrollPane. Положение: под переключателями, полностью растянута по ширине, приблизительно две трети оставшегося вертикального пространства.
      • JPanel. имя переменной: mainPanel. размещение: "Border". расположение: заполнение mainScrollPane.
      • JButton. имя переменной: mainPictureButton. текст: Waiting for picture... расположение: внутри mainPanel (вследствие размещения панели "Border" кнопка автоматически заполняет все пространство.)
    • JScrollPane. имя переменной: thumbnailScrollPane. расположение: под переключателями, заполнение всего горизонтального и оставшегося вертикального пространства.
      • JPanel. имя переменной: thumbnailPanel. размещение: "Grid". расположение: заполнение thumbnailScrollPane. Размещение "Grid" соответствует равному размеру четырех следующих кнопок и полному заполнению thumbnailPanel. Кнопки на thumbnailPanel
        Имя переменной Текст
        asterButton Waiting...
        honeysuckleButton Waiting...
        roseButton Waiting
        sunflowerButton Waiting...

    На этом этапе FlowerFrame должен выглядеть как на рисунке ниже:
    Законченный FlowerFrame, вместо изображений выводится текст кнопок

  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 вызывается метод setThumbnails, расположенный в FlowerFrame:
    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];
    
            // Операция "getFlower" веб-службы вызывается 4 раза, каждый раз в отдельном потоке.        // По выполнении этой операции изображение выводится на определенной кнопке. 
            for (int i=0; i<4;i++) {
                final int index = i;
                tasks[i] = new Runnable() {
                    public void run() {
                        try {
    
                            // Вызов операции "getFlower" для веб-службы: 
                            Image img = port.getFlower(FlowerFrame.FLOWERS[index]);
                            System.out.println("picture downloaded: "+FlowerFrame.FLOWERS[index]);
    
                            // Следующие строки добавляются в hashmap: 
                            flowers.put(FlowerFrame.FLOWERS[index],img);
    
                            // Вызов операции "showFlower" для FlowerFrame: 
                            frame.showFlower();
    
                        } catch (IOException_Exception ex) {
                            ex.printStackTrace();
                        }
                        downloadedPictures++;
                    }
                };
                new Thread(tasks[i]).start();
            }
            // По завершении предыдущих четырех потоков в отдельном потоке немедленно вызывается операция веб-службы "getThumbnails".
            // После загрузки изображений в нижней части фрейма выводятся эскизы. 
            Runnable thumbsTask = new Runnable() {
                public void run() {
                    try {
                        while (downloadedPictures < 4) {
                            try {Thread.sleep(100);} catch (InterruptedException ex) {}
                        }
    
                        // Вызов операции 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. Удалите существующий метод main в классе FlowerFrame.

На этом веб-службу можно считать готовой – код, взаимодействующий с веб-службой, делегируемой в модуль EJB, выводит необходимые изображения. Щелкните клиент правой кнопкой мыши и выберите "Run". Приложение Swing должно запуститься и через некоторое время заполниться изображениями, полученными из веб-службы.

Что дальше?

Протоколирование и оптимизация службы

Оставить комментарии и предложения, обратиться за поддержкой и получить информацию о последних достижениях в области функциональных возможностей разработки для Java EE с помощью среды IDE NetBeans можно в списке рассылки .

Companion
Projects:
MySQL Database Server   GlassFish Community: an Open Source Application Server   Open Solaris  Open JDK: an Open SourceJDK   Mobile & Embedded Community     Sponsored by 
Sponsored by Sun Microsystems