Вопрос

В настоящее время у меня есть небольшая 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 () .

Это было полезно?

Решение

Апплет является контейнер , всего лишь add твой холст есть.

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

Как правило, у вас должно быть приложение, которое также является апплетом, которое заключается в том, чтобы ваш класс точки входа расширял 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. Вместо этого используйте JComponent setOpaque (true) ).

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top