Рисование холста в апплете

В настоящее время у меня есть небольшая программа Java, которую я хотел бы запустить как на рабочем столе (то есть в JFrame), так и в апплете. В настоящее время весь рисунок и логика обрабатываются классом, расширяющим Canvas. Это дает мне очень хороший основной метод для настольного приложения:

public static void main(String[] args) {
    MyCanvas canvas = new MyCanvas();
    JFrame frame = MyCanvas.frameCanvas(canvas);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    canvas.loop();
}

Могу ли я сделать что-то подобное для апплета? В идеале MyCanvas оставался бы одинаковым для обоих случаев.

Не уверен, что это важно, но я рисую с помощью BufferStrategy с setIgnoreRepaint(true).

Редактировать: Чтобы прояснить, моя проблема, похоже, заключается в рисовании холста, поскольку все рисование выполняется с помощью вызова canvas.loop().

Почему вы не используете Java Web Start или JavaFX? Апплеты такие 90 '

Eldelshell 08.01.2009 19:13

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

user50264 08.01.2009 19:46
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
2
5 906
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Апплет - это Контейнер, просто Добавлять ваш Canvas.

Как правило, у вас есть приложение, которое также является апплетом, чтобы ваш класс точки входа расширял Applet, а его настройка добавляла Canvas к себе и т. д. И т. Д.

Затем в основной версии метода вы просто создаете экземпляр своего класса Applet и добавляете его в новый фрейм (или JApplet / JFrame и т. д.).

См. Примеры техники в здесь и здесь, которая по существу сводится к (из первого примера):

  public static void main(String args[])
  {
    Applet applet = new AppletApplication();
    Frame frame = new Frame();
    frame.addWindowListener(new WindowAdapter()
    {
      public void windowClosing(WindowEvent e)
      {
        System.exit(0);
      }
    });

    frame.add(applet);
    frame.setSize(IDEAL_WIDTH,IDEAL_HEIGHT);
    frame.show();
  }

Canvas не подходит для добавления в компоненты Swing. Вместо этого используйте JComponentsetOpaque(true)).

Компонентами Swing всегда следует управлять в потоке отправки событий AWT (EDT). Используйте java.awt.EventQueue.invokeLater (invokeAndWait для апплетов). Вы не должны выполнять какие-либо блокирующие операции из EDT, поэтому запустите для этого свои собственные потоки. По умолчанию вы работаете в основном потоке (или потоке апплета для апплетов), который совершенно отделен от EDT.

Предлагаю убрать любую зависимость от MyCanvas к JFrame. Я также предлагаю хранить код для приложений, использующих фрейм, отдельно от кода, использующего апплеты. Добавление компонента к JApplet такое же, как и для JFrame (в обоих случаях есть махинации, когда на самом деле происходит то, что add фактически вызывает getContentPane().add, что может вызвать некоторую ненужную путаницу). Основное отличие состоит в том, что вы не можете использовать pack апплет.

Предполагая, что вы используете JApplet (который является компонентом Swing), а не Applet, единственный способ использовать BufferStrategy в апплете - это добавить к нему Canvas.

finnw 11.06.2010 16:40

Другие вопросы по теме