Преобразование JApplet в JPanel для использования в другом классе
Я довольно новичок в программировании здесь.
У меня есть сложный JApplet, который успешно работает сам по себе, но для целей проекта мне бы хотелось, чтобы он открывался в новом окне при нажатии кнопки в другом JApplet. Один из способов, о которых я слышал, - сделать JApplet расширением JPanel, а затем добавить JPanel в другое приложение, как обычно. (В этом случае, вставив его в JFrame).
Однако, когда я пытаюсь это сделать, я получаю эту ошибку при компиляции:
.\Puzzle.java:241: error: cannot find symbol
wall = getImage(getCodeBase(),"metalcrate.jpg");
^
symbol: method getCodeBase()
location: class Puzzle
.\Puzzle.java:267: error: cannot find symbol
goal = getImage(getCodeBase(), "redxicon.png");
^
symbol: method getCodeBase()
location: class Puzzle
2 errors
И это на бегу:
java.lang.IllegalArgumentException: adding a window to a container
at java.awt.Container.checkNotAWindow(Container.java:488)
at java.awt.Container.addImpl(Container.java:1089)
at java.awt.Container.add(Container.java:1003)
at javax.swing.JApplet.addImpl(JApplet.java:315)
at java.awt.Container.add(Container.java:415)
at Test.init(Test.java:27)
at sun.applet.AppletPanel.run(AppletPanel.java:434)
at java.lang.Thread.run(Thread.java:745)
Это суть того, как другой апплет откроет этот как JPanel/JFrame. Код для апплета, который я пытаюсь преобразовать, довольно длинный, поэтому я не был уверен, стоит ли публиковать его полностью здесь. Однако он использует ActionEvents и ItemEvents, рисует изображения из файлов и пустой макет (это грубая версия игры Rushhour), и мне интересно, может ли это быть частью проблемы.
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class Test extends JApplet implements ActionListener
{
JButton play;
JFrame newWindow;
Puzzle testpanel;
public void init()
{
setLayout(new FlowLayout());
play = new JButton("Play!");
play.addActionListener(this);
add(play);
testpanel = new Puzzle();
newWindow = new JFrame ("test frame");
newWindow.setBounds(50, 50, 700,600 );
newWindow.add(testpanel);
newWindow.pack();
newWindow.setVisible(true);
add(newWindow);
}
public void actionPerformed (ActionEvent ae)
{
Object src = ae.getSource();
if (src == play)
newWindow.setVisible(false);
}
}
Что я здесь не так делаю? Есть ли более простой способ сделать это для того же эффекта?