В настоящее время у меня есть небольшая программа 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 ... так что JavaFX мне не очень помогает, учитывая, что мне придется переписывать то, что у меня уже есть :) На самом деле не рассматривал запуск веб-сайта, но Я бы хотел, чтобы эта штука запускалась в браузере, если это вообще возможно.




Как правило, у вас есть приложение, которое также является апплетом, чтобы ваш класс точки входа расширял 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 фактически вызывает getContentPane().add, что может вызвать некоторую ненужную путаницу). Основное отличие состоит в том, что вы не можете использовать pack апплет.
Предполагая, что вы используете JApplet (который является компонентом Swing), а не Applet, единственный способ использовать BufferStrategy в апплете - это добавить к нему Canvas.
Почему вы не используете Java Web Start или JavaFX? Апплеты такие 90 '