Рисование холста в апплете - PullRequest
1 голос
/ 08 января 2009

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

Ответы [ 3 ]

2 голосов
/ 08 января 2009

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

1 голос
/ 08 января 2009

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

Затем в основной версии метода вы просто создаете экземпляр своего класса Applet и добавляете его в новый Frame (или 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();
  }
0 голосов
/ 08 января 2009

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

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

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

...