Цель этого упражнения состоит в создании клиента веб-службы, которая была создана и развернута ранее, с последующим добавлением к этому клиенту графического интерфейса. Интерфейс служит для вывода на экран изображений, переданных веб-службой в виде двоичных данных.
Ниже приведена процедура создания веб-приложения. Внутри этого приложения создается клиент, потребляющий веб-службу, которая была создана и изменена в предыдущих руководствах. Затем к веб-приложению добавляется JFrame, и внутри него с помощью элементов Swing разрабатывается интерфейс GUI. Наконец, выполняется связывание элементов Swing с кодом клиента веб-службы.
Создание клиента Swing:
Выберите "File > New Project" (Ctrl-Shift-N). Откроется мастер создания проекта. Выберите "Java Application" в категории "Java". Нажмите кнопку "Next". Откроется мастер "New Java Application". Введите FlowerClient в текстовом поле "Project Name" и нажмите кнопку "Finish". В результате создается новый проект приложения на Java.
Щелкните правой кнопкой мыши узел проекта 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 добавляются узлы, как показано ниже:
Щелкните правой кнопкой мыши узел FlowerClient и выберите "New > JFrame". Присвойте фрейму имя FlowerFrame.
Добавьте панель JPanel к FlowerFrame. Разверните ее на весь размер FlowerFrame. Присвойте панели имя gardenFlowersPanel.
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 в редакторе исходного кода следующим образом:">
Инициализируйте 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 вызывается метод setThumbnails, расположенный в FlowerFrame:
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();
}
}
Исправьте параметры импорта в Main.java.
Удалите существующий метод main в классе FlowerFrame.
На этом веб-службу можно считать готовой – код, взаимодействующий с веб-службой, делегируемой в модуль EJB, выводит необходимые изображения. Щелкните клиент правой кнопкой мыши и выберите "Run". Приложение Swing должно запуститься и через некоторое время заполниться изображениями, полученными из веб-службы.
Оставить комментарии и предложения, обратиться за поддержкой и получить информацию о последних достижениях в области функциональных возможностей разработки для Java EE с помощью среды IDE NetBeans можно в списке рассылки .