Spec-Zone .ru
спецификации, руководства, описания, API
След: Создание GUI С JFC/Swing
Урок: Используя Компоненты Swing
Раздел: Как Использовать Различные Компоненты
Как Сделать Апплеты
Домашняя страница > Создание GUI С JFC/Swing > Используя Компоненты Swing

Как Сделать Апплеты

Этот раздел покрытия JApplet — class, который позволяет апплетам использовать компоненты Swing. JApplet подкласс java.applet.Applet, который покрывается следом Апплетов Java. Если Вы никогда не писали регулярный апплет прежде, мы убеждаем Вас считать тот след перед продолжением этого раздела. Информация, предоставленная в том следе, применяется к апплетам Swing, за немногим исключением что этот раздел объясняет.

Любой апплет, который содержит компоненты Swing, должен быть реализован с подклассом JApplet. Вот версия Swing одного из апплетов, которые помогли сделать Java известным — апплет анимации, который (в его самой известной конфигурации) показывает нашему Герцогу талисмана, делающему колеса телеги:

Ваш браузер полностью игнорирует <АППЛЕТ> тег!

Отметьте:  

Если Вы не видите, что апплет работает, Вы должны установить выпуск 6 (или позже) Java Комплект разработчика SE (JDK).


Можно найти основной исходный код для этого апплета в TumbleItem.java.

Этот раздел обсуждает следующие темы:

Функции, Обеспеченные JApplet

Поскольку JApplet верхний уровень контейнер Swing, у каждого апплета Swing есть корневая область. Самые значимые эффекты присутствия корневой области являются поддержкой добавления строки меню и потребности использовать область контента.

Как описано в Использовании Высокоуровневых Контейнеров, каждый высокоуровневый контейнер, таких как a JApplet имеет единственную область контента. Область контента делает апплеты Swing отличающимися от регулярных апплетов следующими способами:

Потоки в Апплетах

Компоненты Swing должны быть созданы, запрошены, и управляться на диспетчеризирующем событие потоке, но браузеры не вызывают методы "вехи" апплета от того потока. Поэтому методы вехи — init, start, stop, и destroy — должен использовать SwingUtilities метод invokeAndWait (или, если приспособлено, invokeLater) так, чтобы код, который обращается к компонентам Swing, был выполнен на диспетчеризирующем событие потоке. Больше информации об этих методах и диспетчеризирующем событие потоке находится в Параллелизме в Swing.

Вот пример init метод:

public void init() {
    //Execute a job on the event-dispatching thread:
    //creating this applet's GUI.
    try {
        javax.swing.SwingUtilities.invokeAndWait(new Runnable() {
            public void run() {
                createGUI();
            }
        });
    } catch (Exception e) {
        System.err.println("createGUI didn't successfully complete");
    }
}

private void createGUI() {
    JLabel label = new JLabel(
                       "You are successfully running a Swing applet!");
    label.setHorizontalAlignment(JLabel.CENTER);
    label.setBorder(BorderFactory.createMatteBorder(1,1,1,1,Color.black));
    getContentPane().add(label, BorderLayout.CENTER);
}

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

init метод в TumbleItem более сложно, как следующие шоу кода. Как первый пример, это init использование реализации метода SwingUtilities.invokeAndWait выполнить код создания GUI диспетчеризирующего событие потока. Это init метод устанавливает таймер Swing, чтобы запустить события действия обновление анимация. Кроме того, init использование javax.swing.SwingWorker создать фоновую задачу, которая загружает файлы изображений анимации, позволяя апплету представить GUI сразу же, не ожидая всех ресурсов, которые будут загружены.

private void createGUI() {
    ...
    animator = new Animator();
    animator.setOpaque(true);
    animator.setBackground(Color.white);
    setContentPane(animator);
    ...
}

public void init() {
    loadAppletParameters();

    //Execute a job on the event-dispatching thread:
    //creating this applet's GUI.
    try {
        javax.swing.SwingUtilities.invokeAndWait(new Runnable() {
            public void run() {
                createGUI();
            }
        });
    } catch (Exception e) { 
        System.err.println("createGUI didn't successfully complete");
    }

    //Set up the timer that will perform the animation.
    timer = new javax.swing.Timer(speed, this);
    timer.setInitialDelay(pause);
    timer.setCoalesce(false);
    timer.start(); //Start the animation.

    //Background task for loading images.
    SwingWorker worker = (new SwingWorker<ImageIcon[], Object>() {
            public ImageIcon[] doInBackground() {
                final ImageIcon[] innerImgs = new ImageIcon[nimgs];
            ...//Load all the images...
            return imgs;
        }
        public void done() {
            //Remove the "Loading images" label.
            animator.removeAll();
            loopslot = -1;
            try {
                imgs = get();
            } ...//Handle possible exceptions
        }

    }).execute();
}

Можно найти исходный код апплета в TumbleItem.java. Чтобы счесть все файлы требуемыми для апплета, см., что пример индексирует.

Используя Изображения в Апплете Swing

Applet class обеспечивает getImage метод для того, чтобы загрузить изображения в апплет. getImage метод создает и возвращается Image объект, который представляет загруженное изображение. Поскольку компоненты Swing используют Icons, а не Images, чтобы обратиться к изображениям, апплеты Swing имеют тенденцию не использовать getImage. Вместо этого апплеты Swing создают экземпляры ImageIcon — значок загружался от файла изображения. ImageIcon идет с сохраняющим код преимуществом: это обрабатывает изображение, отслеживающее автоматически. Обратитесь к тому, Как Использовать Значки для получения дополнительной информации.

Анимация Герцога, делающего колеса телеги, требует 17 различных изображений. Апплет использует тот ImageIcon на изображение и загружает их в init метод. Поскольку изображения могут занять много времени, чтобы загрузиться, значки загружаются в отдельном потоке, реализованном a SwingWorker объект. Вот код:

public void init() {
    ...
    imgs = new ImageIcon[nimgs];
    (new SwingWorker<ImageIcon[], Object>() {
        public ImageIcon[] doInBackground() {
            //Images are numbered 1 to nimgs,
            //but fill array from 0 to nimgs-1.
            for (int i = 0; i < nimgs; i++) {
                imgs[i] = loadImage(i+1);
            }
            return imgs;
        }
        ...
    }).execute();

}
...
protected ImageIcon loadImage(int imageNum) {
    String path = dir + "/T" + imageNum + ".gif";
    int MAX_IMAGE_SIZE = 2400;  //Change this to the size of
                                 //your biggest image, in bytes.
    int count = 0;
    BufferedInputStream imgStream = new BufferedInputStream(
       this.getClass().getResourceAsStream(path));
    if (imgStream != null) {
        byte buf[] = new byte[MAX_IMAGE_SIZE];
        try {
            count = imgStream.read(buf);
            imgStream.close();
        } catch (java.io.IOException ioe) {
            System.err.println("Couldn't read stream from file: " + path);
            return null;
        }
        if (count <= 0) {
            System.err.println("Empty file: " + path);
            return null;
        }
        return new ImageIcon(Toolkit.getDefaultToolkit().createImage(buf));
    } else {
        System.err.println("Couldn't find file: " + path);
        return null;
    }
}

loadImage метод загружает изображение для указанного фрейма анимации. Это использует getResourceAsStream метод, а не обычное getResource метод, чтобы получить изображения. Получающийся код не симпатичен, но getResourceAsStream более эффективно чем getResource для того, чтобы загрузить изображения из файлов JAR в апплеты, которые выполняются, используя Java программное обеспечение Plug-in™. Для получения дальнейшей информации см. Загружающиеся Изображения В Апплеты.

Встраивание Апплета в Странице HTML

Можно развернуть простой апплет при использовании applet тег. Вот applet тег для катящегося кувырком апплета Герцога:

<applet code="TumbleItem.class" 
        codebase="examples/"
        archive="tumbleClasses.jar, tumbleImages.jar"
        width="600" height="95">
    <param name="maxwidth" value="120">
    <param name="nimgs" value="17">
    <param name="offset" value="-57">
    <param name="img" value="images/tumble">

Your browser is completely ignoring the <applet> tag!
</applet>

Чтобы развернуть более сложные апплеты, которые будут работать легко в многократных средах, см. Развертывание Апплета в уроке Апплетов Java.

API JApplet

Следующая таблица приводит интересные методы это JApplet добавляет к API апплета. Они дают Вам, доступ к функциям, обеспеченным полностью, разделяет на области. Другие методы, которые Вы могли бы использовать, определяются Component и Applet классы. См. Компонентные Методы для списка обычно используемого Component методы, и Апплеты Java для справки в использовании Applet методы.

Метод Цель
освободите setContentPane (Контейнер)
Контейнер getContentPane ()
Набор или получает область контента апплета. Область контента содержит видимые компоненты GUI апплета и должна быть непрозрачной.
освободите setRootPane (JRootPane)
JRootPane getRootPane ()
Создайте, установите, или получите корневую область апплета. Корневая область управляет внутренней частью апплета включая область контента, стеклянную область, и так далее.
освободите setJMenuBar (JMenuBar)
JMenuBar getJMenuBar ()
Набор или заставляет строку меню апплета управлять рядом меню для апплета.
освободите setGlassPane (Компонент)
Компонент getGlassPane ()
Набор или получает стеклянную область апплета. Можно использовать стеклянную область, чтобы прервать события от нажатия мыши.
освободите setLayeredPane (JLayeredPane)
JLayeredPane getLayeredPane ()
Набор или получает многоуровневую область апплета. Можно использовать многоуровневую область апплета, чтобы поместить компоненты сверху или позади других компонентов.

Пример апплета

Эта таблица показывает примеры апплетов Swing и где те примеры описываются.

Пример Где Описано Примечания
TumbleItem Эта страница Апплет анимации

Проблемы с примерами? Попытайтесь Компилировать и Выполнить Примеры: FAQ.
Жалобы? Поздравление? Предложения? Дайте нам свою обратную связь.

Предыдущая страница: Как Использовать Различные Компоненты
Следующая страница: Как Использовать Кнопки, Флажки, и Переключатели