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