Логин:   Пароль:




Новости
Рассылки
Форум
Поиск


Java
- Апплеты
- Вопрос-ответ
- Классы
- Примеры
- Руководства
- Статьи
- IDE
- Словарь терминов
- Скачать

Мобильная Java
- Игры
- Примеры
- Статьи
- WAP, WML и пр.

JavaScript
- Вопрос-ответ
- Примеры
- Статьи

Веб-мастеринг
- HTML
- CSS
- SSI

Разминка для ума
Проекты
Книги
Ссылки
Программы
Юмор :)




Rambler's Top100

РассылкиАрхив Java programmingВыпуск 7-й

Здравствуйте дорогие читатели!

Содержание

1. Начинающим
2. Тема "на заказ"
3. Вопрос - ответ
4. Программный код...
5. JavaScript

Начинающим

Введение в язык Java

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

Давайте начнём с простого примера Hello World - с него все начинают, просто проще некуда.


class HelloWorld 
{
 public static void main (String args [])
 { 
  System. out. println ("Hello World");
 } 
}

Если у вас нет средства разработки Java приложений а просто установлен пакет JDK(Java Developers Kit ), то для проверки работоспособности примера вам необходимо запустить транслятор Java - javac, указав в качестве параметра имя файла с исходным текстом:
С: \> javac HelloWorld.Java
естественно предварительно сохранив исходный текст в файл с именем HelloWorld.Java

Обязательно проверьте соответствие прописных букв в имени файла с названием содержащегося в нем класса!

Транслятор создаст файл HelloWorld.class с независимым от процессора байт-кодом. Для того чтобы исполнить полученный код, необходимо иметь среду времени выполнения языка Java, в которую надо загрузить новый класс для исполнения:
С: > java HelloWorld

Давайте проанализируем все элементы, из которых состоит приведённый пример, и ознакомимся с понятиями и деталями синтаксиса языка Java.

В строке class HelloWorld использовано зарезервированное слово class. Оно говорит транслятору, что мы собираемся описать новый класс. Полное описание класса располагается между открывающей фигурной скобкой и парной ей закрывающей.

Строка public static void main (String args []) содержит массу ключевых слов:

public - модификатор доступа, который позволяет программисту управлять видимостью любого метода и любой переменной. В данном случае модификатор доступа public означает, что метод main виден и доступен любому классу. Существуют еще два указателя уровня доступа - private и protected.

static - с помощью этого слова объявляются методы и переменные класса, используемые для работы с классом в целом. Методы, в объявлении которых использовано ключевое слово static, могут непосредственно работать только с локальными и статическими переменными.

void показывает, что метод main не возвращает значение.

main - имя метода main. Все существующие реализации Java-интерпретаторов, получив команду интерпретировать класс, начинают свою работу с вызова метода main. Java-транслятор может оттранслировать класс, в котором нет метода main. А вот Java-интерпретатор запускать классы без метода main не умеет.

Все параметры, которые нужно передать методу, указываются внутри пары круглых скобок в виде списка элементов, разделенных символами ";". Каждый элемент списка параметров состоит из разделенных пробелом типа и идентификатора. Даже если у метода нет параметров, после его имени все равно нужно поставить пару круглых скобок.

Элемент String args[] объявляет параметр с именем args, который является массивом объектов - представителей класса String. Обратите внимание на квадратные скобки, стоящие после идентификатора args. Они говорят о том, что мы имеем дело с массивом, а не с одиночным элементом указанного типа.

В строке System. out. prlntln("Hello World!"); выполняется метод println объекта out>. Объект out объявлен в классе OutputStream и статически инициализируется в классе System.

Лексические основы

Программы на Java - это набор пробелов, комментариев, ключевых слов, идентификаторов, литеральных констант, операторов и разделителей.

Пробелы

Java - язык, который допускает произвольное форматирование текста программ. Для того, чтобы программа работала нормально, нет никакой необходимости выравнивать ее текст специальным образом. Например, класс HelloWorld можно было записать в двух строках или любым другим способом, который придется вам по душе. И он будет работать точно так же при условии, что между отдельными лексемами (между которыми нет операторов или разделителей) имеется, по крайней мере, по одному пробелу, символу табуляции или символу перевода строки.

Комментарии

Хотя комментарии никак не влияют на исполняемый код программы, при правильном использовании они оказываются весьма существенной частью исходного текста. Существует три разновидности комментариев: комментарии в одной строке, комментарии в нескольких строках и, наконец, комментарии для документирования. Комментарии, занимающие одну строку, начинаются с символов // и заканчиваются в конце строки. Такой стиль комментирования полезен для размещения кратких пояснений к отдельным строкам кода: System. out. prlntln("Hello World!"); // Hello World!

Для более подробных пояснений вы можете воспользоваться комментариями, размещенными на нескольких строках, начав текст комментариев символами /* и закончив символами */ При этом весь текст между этими парами символов будет расценен как комментарий и транслятор его проигнорирует.

/* При этом весь текст между этими парами символов будет расценен как комментарий и транслятор его проигнорирует. */

Третья, особая форма комментариев, предназначена для сервисной программы javadoc, которая использует компоненты Java-транслятора для автоматической генерации документации по интерфейсам классов. Соглашение, используемое для комментариев этого вида, таково: для того, чтобы разместить перед объявлением открытого (public) класса, метода или переменной документирующий комментарий, нужно начать его с символов /** (косая черта и две звездочки). Заканчивается такой комментарий точно так же, как и обычный комментарий - символами */. Программа javadoc умеет различать в документирующих комментариях некоторые специальные переменные, имена которых начинаются с символа @. Вот пример такого комментария:


class CoolApplet extends Applet
{ 

 /**
 У этого метода два параметра:
 @param key - это имя параметра.
 @param value - это значение параметра с именем key
 */

 void put (String key, Object value) 
 {
 }
}

Тема "на заказ"

Модель ICQ

Сегодня мы продолжаем поднятую, в пятом номере, тему RMI и как я обещал, рассмотрим модель ICQ построенную с помощью RMI. Конечно, мы рассмотрим не полную модель, а только примитив.

Начнём с того, что у нас имеется два приложения: первое - клиент; второе - сервер. По сути, нам видна только связь между двумя клиентами, но на самом деле всё обстоит следующим образом.

Рис.1

1. Клиент 1 посылает запрос на сервер на связь с Клиентом 2.
2. Сервер проверяет наличие Клиента 2 в сети.
3. В зависимости от результата шага:
а) если Клиент 2 в сети:
4. Сервер посылает сообщение Клиенту 1, что Клиент 2 в сети.
5. Сервер посылает сообщение Клиенту 2, что будет установлена вязь с Клиентом 1.
6. Сервер устанавливает два канала связи: Клиент 1 -> Сервер -> Клиент 2 и Клиент 2 -> Сервер -> Клиент 1.
б) если Клиент 2 не в сети:
4. Сервер посылает сообщение Клиенту 1, что Клиент 2 не в сети.
5. Сервер создаёт очередь сообщений, которая будет отправлена Клиенту 2 при его подключении и заносит туда сообщение от Клиента 1.

Но вы только представьте себе что случиться если клиентов не 2, а скажем... 1.000.000 или 10.000.000. Трудновато придется серверу. Как решить данную проблему?

Можно предложить поставить головной сервер и перенаправлять запросы на более свободные вспомогательные сервера. Но и это не решит проблемы в полной мере. По этому предлагается поступить по другому.

Рис.1

1. Клиент 1 посылает запрос на сервер на связь с Клиентом 2.
2. Сервер проверяет наличие Клиента 2 в сети.
3. В зависимости от результата шага:
а) если Клиент 2 в сети:
4. Сервер посылает сообщение Клиенту 1, что Клиент 2 в сети.
5. Сервер посылает сообщение Клиенту 2, что будет установлена вязь с Клиентом 1.
6. Сервер передаёт данные о Клиенте 2 Клиенту 1 и Клиенту 2 о Клиенте 1.
7. Устанавливается связь между Клиентом 1 и Клиентом 2, минуя Сервер.
8. Если связь не установилась, Клиенты информируют Сервер о не удачи попытки установить связь. Процедура повторяется несколько раз. Количество попыток ограничено и контролируется Сервером.
б) если Клиент 2 не в сети:
4. Сервер посылает сообщение Клиенту 1, что Клиент 2 не в сети.
5. Сервер создаёт очередь сообщений, которая будет отправлена Клиенту 2 при его подключении и заносит туда сообщение от Клиента 1.

Вот эта модель, хоть и сложнее первой, позволяет существенно снизить нагрузку на сервер, так как основной поток информации будет проходить мимо сервера.

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

Что это нам даст? Ну, во-первых, это адресуется не только к уже умеющим использовать язык Java, но и к начинающим которым это даст возможность более детально вникнуть в структуру языка. Ведь предложив свою идею, они увидят её воплощение или воплощение сродной ей идеи.

Во-вторых, я думаю, уже имеющие дело с Java смогут почерпнуть что-то и для себя.

В-третьих, может у нас получится достойный программный продукт!?

Жду ваших моделей, советов, решений и всего что касается открытой темы на E-mail [email protected] с пометкой Java модель ICQ.

Drag-and-drop

В пакет java.awt.dnd включено определение трёх интерфейсов и двенадцати классов.

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

DragTargetListener - интерфейс обратного вызова (callback), используемый классом DropTarget.

FlavorMap - интерфейс, устанавливающий соответствие между типами данных, специфическими для данной вычислительной платформы, и типами данных MIME.

DnDConstants - класс, который содержит определения используемых в технологии перетаскивания (drag-and-drop - DnD) поименованных констант, например ACTION_COPY или ACTION_MOVE.

DragSource - класс, порождающий операцию перетаскивания.

DragSourceContext - класс объекта-получателя при выполнении операции перетаскивания. Направляет извещающие события классу DragSourceListener и предоставляет объект типа Transferable для перемещения данных.

DragSourceDragEvent - класс события (производный от класса DragSourceEvent), которое направляется из класса DragSourceContextPeer через класс DragSourceContext в класс DragSourceListener.

DragSourceDropEvent - класс события, который напоминает класс DragSourceDragEvent, но используется для извещения класса DragSourceListener о том, что операция завершена.

DragSourceEvent - базовый класс для классов DragSourceDragEvent и DragSourceDropEvent.

DropTarget - любой из компонентов, способный принимать перетаскиваемые объекты, должен быть ассоциирован с данным классом.

DropTargetContext - когда при выполнении операции перетаскивания указатель мыши проходит над объектом, ассоциированным с классом DropTarget, интерпретатор создает экземпляр нового объекта класса DropTargetContext. Созданный объект может использоваться отображаемым на экране компонентом для обратной связи с пользователем и для завершения операции перетаскивания.

DropTargetContext.TransferableProxy - внутренний класс, используемый классом DropTargetContext.

DropTargetDragEvent - класс, через который блок DropTargetListener() получает сообщения dragEnter(), dragOver() и dragScroll().

DropTargetDropEvent - класс, через который блок DropTargetListener получает сообщение drop().

DropTargetEvent - базовый класс для классов DropTargetDragEvent и DropTargetDropEvent.

Операции перетаскивания позволяют создавать мощные интуитивно понятные пользователю интерфейсы. Функции DnD базируются на концепции перемещаемых (Transferable) объектов Java. Если в классе реализуется интерфейс Transferable, то объекты этого класса могут вставляться или перетаскиваться в контейнеры, от которых не требуется умения оперировать ими в их исходном виде. Любые объекты должны поддерживать концепцию параметров DataFlavor, предназначенную для описания различных типов этих объектов.

Пример реализации вы можете посмотреть в шестом выпуске, (архив рассылки находится на http://www.yg.h1.ru в разделе рассылки).

Вопрос - ответ

Вопрос:

Меня интересует, есть ли возможность установки перетаскиваемого изображения при Drag'n'Drop (то есть, чтобы вместе с курсором при перетаскивании двигалось еще и изображение кнопки, например).
Андрей Похилько

Ответ:

По идеи должен работать следующий метод (в нашем примере из шестого номера):

Cодержимое метода public void dragGestureRecognized(DragGestureEvent dge) заменяем на


Transferable transferable = new ViewTransferable();
Image img= createImage(button.getWidth(),button.getHeight());
button.paint(img.getGraphics());
Cursor c=new Cursor(Cursor.DEFAULT_CURSOR);
dge.startDrag(null,img,new Point(0,0),transferable,this);

Но этот метод работает не везде. Вот этот метод DragSource.isDragImageSupported() возвращает true, если платформа поддерживает изображение при перетаскивании.

Могу предложить несколько других вариантов в обход основного:

1. Перетаскивать сам объект. Для этого в рассмотренном нами примере (в шестом номере)

в метод dragOver(DropTargetDragEvent dtde) надо добавить:

button.setLocation((int) dtde.getLocation().getX(),(int)dtde.getLocation().getY());

2. Можно сделать следующим образом:

Добавим в метод dragOver(DropTargetDragEvent dtde) следующие:


int x=(int)dtde.getLocation().getX();
int y=(int)dtde.getLocation().getY();
if((x!=xx)||(y!=yy))  dtde.getDropTargetContext().getComponent().repaint();
Image img = createImage(button.getWidth(),button.getHeight());
button.paint(img.getGraphics());
dtde.getDropTargetContext().getComponent().getGraphics().drawImage(
              img,xx,yy,dtde.getDropTargetContext().getComponent());
xx=x;
yy=y;

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

3. Можно создать некий компонент, прорисовав на нём нужное нам изображение и двигать его вместо перетаскиваемого компонента.

Пример такого подхода привожу в разделе "Программный код...".

4. Если речь идёт только об одном приёмнике (контейнере), для которого было бы специфично отображать изображение перетаскиваемого объекта, то целесообразно будет написать новый класс такого приёмника (контейнера).

Вопрос:

Расскажите пожалуйста как в Java при обработке событий мыши можно различать какая кнопка мыши нажата (правая или левая), и можно ли по отдельности обрабатывать события от этих кнопок?
Николай

Ответ:


public void mousePressed(MouseEvent e)
{
 if (e.getModifiers()==e.BUTTON1_MASK)
 {
  //Какое либо действие
 }
 if (e.getModifiers()==e.BUTTON2_MASK)
 {
    //Какое либо действие
 }
 if (e.getModifiers()==e.BUTTON3_MASK)
 {
    //Какое либо действие
 }
}

Вопрос:

Как из программы написанной на Java сделать exe-приложение. То есть приложение запускаемое файлом с расширением exe. Хотя бы на примере Hello, world! :) Если для этого нет прямых методов, то может быть есть какие-нибудь обходные пути?
Николай

Ответ:

JET - Оптимизирующий компилятор Java в код x86. Порождает обычные EXE и DLL файлы, не использующие JVM во время исполнения. Поддерживает все пакеты JDK 1.3 SE.

http://www.excelsior-usa.com/jet.html

Вам потребуется выполнить следующею команду: jc =m ИмяКласса.class

Программный код...

Немного модифицированный вариант предыдущего примера (в шестом номере).


import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.awt.dnd.*;
import java.awt.datatransfer.*;
public class DragAndDrop extends Frame
{
 JButton button = new JButton("Hello");
 JPanel panel = new JPanel();
 ComponentA component1=new ComponentA(button);
 public DragAndDrop()
 {
  addWindowListener(new WindowAdapter()
  {
   public void windowClosing(WindowEvent e)
   {
    dispose();
    System.exit(0);
   }
  });
  this.add(panel);
  panel.add(component1);
  panel.add(button);
  setDrag();
 }
 public static void main(String args[])
 {
  System.out.println("Starting Drag And Drop Example ...");
  DragAndDrop mainFrame = new DragAndDrop();
  mainFrame.setSize(400, 400);
  mainFrame.setLocation(100,100);
  mainFrame.setTitle("Drag And Drop Example");
  mainFrame.setVisible(true);
 }
 void setDrag()
 {
 class ViewTransferable implements Transferable
 {
  DataFlavor[] flavors = new DataFlavor[]{DataFlavor.stringFlavor};
  public ViewTransferable()
  {
  }
  public DataFlavor[] getTransferDataFlavors()
  {
   return flavors;
  }
  public boolean isDataFlavorSupported(DataFlavor flavor)
  {
   if (flavor.equals(flavors[0]))
   {
    return true;
   }
   return false;
  }
  public Object getTransferData(DataFlavor flavor)throws UnsupportedFlavorException
  {
   if (!isDataFlavorSupported(flavor))
   {
    System.out.println("unsuported flavor");
    return null;
   }
   if (flavor.equals(flavors[0]))
   {
    return(null);
   }
   return null;
  }
 }
 class CanvasDragSource implements DragGestureListener, DragSourceListener
 {
  CanvasDragSource()
  {
   DragSource dragSource = DragSource.getDefaultDragSource();
   dragSource.createDefaultDragGestureRecognizer(button,DnDConstants.ACTION_COPY_OR_MOVE,this);
  }
  public void dragGestureRecognized(DragGestureEvent dge)
  {
   Transferable transferable = new ViewTransferable();
   dge.startDrag(null,transferable,this);
  }
  public void dropActionChanged(DragSourceDragEvent dsde){}
  public void dragEnter(DragSourceDragEvent dsde){}
  public void dragOver(DragSourceDragEvent dsde){}
  public void dragExit(DragSourceEvent dse){}
  public void dragDropEnd(DragSourceDropEvent dsde){}
 }
 class CanvasDropTarget implements DropTargetListener
 {
  DropTarget dropTarget;
  boolean acceptableType;
  CanvasDropTarget()
  {
   dropTarget = new DropTarget(panel, DnDConstants.ACTION_COPY_OR_MOVE,this,true,null);
  }
  public void dragOver(DropTargetDragEvent dtde)
  {
   acceptOrRejectDrag(dtde);
   component1.setVisible(true);
component1.setBounds((int)dtde.getLocation().getX()+1,(int)dtde.getLocation().getY()+1,
                                                button.getWidth(),button.getHeight());
  }
  public void dropActionChanged(DropTargetDragEvent dtde)
  {
   acceptOrRejectDrag(dtde);
  }
  public void dragExit(DropTargetEvent dte){}
  public void drop(DropTargetDropEvent dtde)
  {
   if ((dtde.getDropAction() & DnDConstants.ACTION_COPY_OR_MOVE) != 0)
   {
    dtde.acceptDrop(dtde.getDropAction());
    dtde.getDropTargetContext().dropComplete(true);
    double x = dtde.getLocation().getX();
    double y = dtde.getLocation().getY();
    button.setLocation((int)x,(int)y);
    component1.setVisible(false);
   }
   else
   {
    dtde.rejectDrop();
   }
  }
  public void dragEnter(DropTargetDragEvent dtde)
  {
   checkTransferType(dtde);
   acceptOrRejectDrag(dtde);
  }
  boolean acceptOrRejectDrag(DropTargetDragEvent dtde)
  {
   int dropAction = dtde.getDropAction();
   int sourceActions = dtde.getSourceActions();
   boolean acceptedDrag = false;
   if (!acceptableType || (sourceActions &DnDConstants.ACTION;_COPY_OR_MOVE) == 0)
   {
    dtde.acceptDrag(DnDConstants.ACTION_COPY);
    acceptedDrag = true;
   }
   else if ((dropAction & DnDConstants.ACTION_COPY_OR_MOVE ) == 0)
    {
     dtde.acceptDrag(DnDConstants.ACTION_COPY);
     acceptedDrag = true;
    }
   return acceptedDrag;
  }
  void checkTransferType(DropTargetDragEvent dtde)
  {
   acceptableType = dtde.isDataFlavorSupported(DataFlavor.stringFlavor);
  }
 }
 new CanvasDragSource();
 new CanvasDropTarget();
 }
}
class ComponentA extends JComponent
{
 Image img;
 JComponent comp;
 ComponentA(JComponent comp)
 {
  this.comp=comp;
  setVisible(false);
 }
 public void paintComponent(Graphics g)
 {
  img = createImage(comp.getWidth(),comp.getHeight());
  comp.paint(img.getGraphics());
  g.drawImage(img,0,0,this);
 }
}

JavaScript

Вопрос:

Этот скрипт создает движущееся меню. И должно работать во всех браузерах, но вот проблема в Netscape он не работает, я все перепробовал, а ошибку найти не мог. Кто может помочь?
Был приведён объёмный скрипт.

Ответ:

Вся проблема в стилях. Netscape 4.0 плохо совместим со стилями, даже в Netscape 6.2 с данным скриптом были проблемы.

Вопрос:

Возник вопрос. Когда-то мне понадобилось создать горизонтальное меню на JavaScript, которое одинаково отображалось в IE и NC. Мне так и не удалось этого сделать. Может быть, Вы поднимете этот вопрос?
Алексей Федоров

Ответ:

Для того чтобы найти причину вашей неудачи, мне необходимо видеть вашу работу.Но так как её я не видел, могу казать только одно - достижение совместимости трудоёмкая задача, которая порой бывает неразрешима без каких либо жертв в ту или иную сторону. Примером может послужить предыдущий вопрос.

Вопрос:

У меня такой вопрос: я хочу сделать (прописать) действия при загрузке. Мне хотелось бы, чтобы кнопки грузились по порядку и ещё некоторые части грузились по порядку или после других объектов, т.е. мне надо упорядочить загрузку объектов и сделать, чтобы они грузились так, как я хочу.
Астапов Денис

Ответ:

Посмотрел я ваш сайт и хочу предложить вам немного другой метод предварительной загрузки изображений из книги Стефана Коха "ВВЕДЕНИЕ В JAVASCRIPT ДЛЯ МАГА".


<html>
<head>
<title>Пример предварительной загрузки изображений</title>
<script language="JavaScript">
<!-- hide
// ******************************************************
// Script from Stefan Koch - Voodoo's Intro to JavaScript
//     http://rummelplatz.uni-mannheim.de/~skoch/js/ 
//       JS-book: http://www.dpunkt.de/javascript
//    You can use this code if you leave this message
//        Editted Yura Ladik http://www.yg.h1.ru
// ******************************************************
// ok, у нас браузер с поддержкой JavaScript 
var browserOK = false;
var pics;
// -->
</script>
<script language="JavaScript1.1">
<!-- hide
//браузер с поддержкой JavaScript 1.1!
 browserOK = true;
 pics = new Array();
// -->
</script>
<script language="JavaScript">
<!-- hide
 var objCount = 0; // количество изображений на  web-странице
 function preload(name, first, second) {  
 // предварительная загрузка изображений и размещение их в массиве 
 if (browserOK)
 {     
  pics[objCount] = new Array(3);
  pics[objCount][0] = new Image();
  pics[objCount][0].src = first;
  pics[objCount][1] = new Image();
  pics[objCount][1].src = second;
  pics[objCount][2] = name;
  objCount++;
 }
}
function on(name)
{
 if (browserOK)
 {
  for (i = 0; i < objCount; i++)
  {
   if (document.images[pics[i][2]] != null)
    if (name != pics[i][2])
    { 
     // вернуть в исходное систояние все другие изображения 
     document.images[pics[i][2]].src = pics[i][0].src;
    }
    else
    {
     // показывать вторую картинку, поскольку курсор пересекает данное изображение
     document.images[pics[i][2]].src = pics[i][1].src;
    }
  }
 }
}

function off()
{
 if (browserOK)
 {
  for (i = 0; i < objCount; i++)
  {
   // вернуть в исходное систо\яние все изображени\я
   if (document.images[pics[i][2]] != null) 
   document.images[pics[i][2]].src = pics[i][0].src;
  }
 }
}

// заранее загружаемые изображения - Вы должны здесь указать 
// изображения, которые нужно загрузить заранее, а также объект Image,
// к которому они относятся (первый аргумент). Именно эту часть 
// нужно корректировать, если Вы хотите использовать скрипт 
// применительно к другим изображениям (конечно это не освобождает
// Вас от обязанности подредактировать в документе также и раздел body)
preload("link1", "img1f.jpg", "img1t.jpg");
preload("link2", "img2f.jpg", "img2t.jpg");
preload("link3", "img3f.jpg", "img3t.jpg");
// -->
</script>
</head>
&#60body>
&#60a href="#" onMouseOver="on('link1')" onMouseOut="off()">
<img name="link1" src="img1f.jpg" width="140" height="50" border="0">
&#60a href="#" onMouseOver="on('link2')" onMouseOut="off()">
&#60img name="link2" src="img2f.jpg" width="140" height="50" border="0"></a>
&#60a href="#" onMouseOver="on('link3')" onMouseOut="off()">
&#60img name="link3" src="img3f.jpg" width="140" height="50" border="0"></a>
&#60/body>
&#60/html>
</font></pre>
<p>Таким же образом можно поступить и с большинством объектов, оперируя ими в &#60head>
&#60/head>

<p>Рабочий пример находиться по адресу <a href="/java/examples/1/1.html" target=_blank>/java/examples/1/1.html</a>
<p>
Вопросы присылайте на E-mail <A HREF="mailto:[email protected]?Subject=Вопрос по Java">[email protected]</A> с пометкой "вопрос по Java". <br>
<p>
Жду вопросов и предложений. <br>
<A HREF="mailto:[email protected]">Юрий Ладик.</A>
<p>
Подписаться на эту рассылку можно тут  <a href="../subs.html">/subs/subs.html</a>
</p>
</div>
<!--КОНЕЦ ОСНОВНОЙ ТЕКСТ -->
</td>
<td width="1" background="../../img/divider.gif"></td>
<td width="130" valign="top">
<div style="padding-left:7px; padding-right:7px">
<img src="../../img/bookshelf.gif">


<p class="news"><img src="http://www.ozon.ru/multimedia/books_covers/small/1000160379.gif" border="1"><br><b>Генри Бекет</b><br>"Java SOAP для профессионалов"<br><a href="/books/aboutbook.php?id=13">Подробнее&gt&gt</a><br><a href="#">Заказать&gt&gt</a></p><p class="news"><img src="http://www.ozon.ru/multimedia/books_covers/small/1000092527.gif" border="1"><br><b>Н. А. Вязовик</b><br>"Программирование на Java. Курс лекций"<br><a href="/books/aboutbook.php?id=23">Подробнее&gt&gt</a><br><a href="#">Заказать&gt&gt</a></p>
<span class="news">
<img src="../../img/important.gif">
<font color="red">Узнай</font> о чем ты на самом деле сейчас думаешь <a href="/humour/now_you_think.html">тут</a>.
<br><br><br>

[an error occurred while processing this directive]
</span>
<br>
<br>
<span class="news">
<img src="../../img/news.gif">
<img src="/img/bulit.gif"><a href="/news/worldnews.php?id=514"></a><br><img src="/img/bulit.gif"><a href="/news/worldnews.php?id=512">Apache Struts 2.0.11</a><br><img src="/img/bulit.gif"><a href="/news/worldnews.php?id=511">Apache MyFaces Trinidad Core 1.2.3.</a><br><img src="/img/bulit.gif"><a href="/news/worldnews.php?id=510"> Sun переводит мобильные устройства с Java ME на Java SE </a><br><img src="/img/bulit.gif"><a href="/news/worldnews.php?id=507">Хакерская атака!</a><br>
</span>
<br>
<br>
<script type="text/javascript"><!--
google_ad_client = "pub-4001110505267280";
google_ad_width = 120;
google_ad_height = 600;
google_ad_format = "120x600_as";
google_ad_type = "text_image";
google_ad_channel ="";
google_color_border = "B4C2AC";
google_color_bg = "FFFFFF";
google_color_link = "0000FF";
google_color_url = "0000FF";
google_color_text = "000000";
//--></script>
<script type="text/javascript"
  src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
<span class="news">
<img src="../../img/archsubs.gif"><br>
<a href="29.html">Выпуск 29-й</a><br>
<a href="28.html">Выпуск 28-й</a><br>
<a href="27.html">Выпуск 27-й</a><br>
<a href="26.html">Выпуск 26-й</a><br>
<a href="25.html">Выпуск 25-й</a><br>
<a href="24.html">Выпуск 24-й</a><br>
<a href="23.html">Выпуск 23-й</a><br>
<a href="22.html">Выпуск 22-й</a><br>
<a href="21.html">Выпуск 21-й</a><br>
<a href="20.html">Выпуск 20-й</a><br>
<a href="19.html">Выпуск 19-й</a><br>
<a href="18.html">Выпуск 18-й</a><br>
<a href="17.html">Выпуск 17-й</a><br>
<a href="16.html">Выпуск 16-й</a><br>
<a href="15.html">Выпуск 15-й</a><br>
<a href="14.html">Выпуск 14-й</a><br>
<a href="13.html">Выпуск 13-й</a><br>
<a href="12.html">Выпуск 12-й</a><br>
<a href="11.html">Выпуск 11-й</a><br>
<a href="10.html">Выпуск 10-й</a><br>
<a href="9.html">Выпуск 9-й</a><br>
<a href="8.html">Выпуск 8-й</a><br>
<a href="7.html">Выпуск 7-й</a><br>
<a href="6.html">Выпуск 6-й</a><br>
<a href="5.html">Выпуск 5-й</a><br>
<a href="4.html">Выпуск 4-й</a><br>
<a href="3.html">Выпуск 3-й</a><br>
<a href="2.html">Выпуск 2-й</a><br>
<a href="1.html">Выпуск 1-й</a><br>
</span>
</div>
</td>
</tr>
  <tr height="80">
<td colspan="5" align="center">
<p align="center">
<a href="#" target="_blank">
<img src="http://www.pokerstars.com/euro_bnrs/euro_current/russian/1024x60.gif" border="0"></a>
</p>
</td>
  </tr>
  <tr>
    <td colspan="3" align="left"><img src="../../img/wround-b-l.gif" width="4" height="4"></td>
    <td colspan="2" align="right"><img src="../../img/wround-b-r.gif" width="4" height="4"></td>
  </tr>
</table>
<p class="copyright">JavaPortal.ru - всё о Java и Javascript | <a href="../../adv.html">Реклама на сайте</a> | <a href="../../link.html">Обратная связь</a><br>
Copyright &copy; Юрий Ладик 2000-2007 г.</p>

</body>
</html>