尝试从小程序切换到 JFrame
Trying to switch from applet to JFrame
所以我正在制作游戏,我想将其从小程序切换到 JFrame,因为我的所有其他 classes 都使用 JFrame。但是,我不断收到一堆我不理解的 运行 时间错误。
我主要尝试将 extends Applet
替换为 'extends JFrame',并制作另一个 class,其中包含游戏的所有内容,例如作为背景,运动,字面意思是整个游戏。
这是 classes 之一,我在其中声明了一个包含游戏其余部分的 JFrame:
public class SpaceGame{
JFrame frame = new JFrame("Space Shooter");
AlienAttack alienAttack = new AlienAttack();
public SpaceGame(){
frame.setBounds(320, 25, 1000, 650);
frame.setResizable(false);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.add(alienAttack);
}
}
这是您在上面看到的 AlienAttack class:
public class AlienAttack extends JFrame implements KeyListener, Runnable
{
double xVel; double yVel; final double SPEED = 0.02;
Thread thread;
int direction;
double x, y;
final double FRICTION = 0.98;
boolean upAccel, downAccel, leftAccel, rightAccel;
ArrayList<Shot> shots;
ArrayList<Alien> aliens;
boolean shipActive;
public void init(){
x=475;
y=300;
direction = 1;
xVel = 0; yVel = 0;
shipActive = true;
upAccel = false; downAccel = false; leftAccel = false; rightAccel = false;
shots = new ArrayList<Shot>();
aliens = new ArrayList<Alien>();
this.addKeyListener(this);
thread = new Thread(this);
thread.start();
}
还有更多内容,但这是我认为相关的内容。顺便说一句,Shot
和 Alien
是其他 classes,我在 ArrayLists 中使用它们。
我得到的一些错误是:
Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: adding a window to a container
(这是主要的)
t java.awt.Container.checkNotAWindow(Unknown Source)
at java.awt.Container.addImpl(Unknown Source)
at java.awt.Container.add(Unknown Source)
at javax.swing.JFrame.addImpl(Unknown Source)
at java.awt.Container.add(Unknown Source)
at SpaceGame.<init>(SpaceGame.java:11)
at TestingGrounds$SnakeHandler.actionPerformed(TestingGrounds.java:82)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
差不多一半了哈哈
简单:
JFrame frame = new JFrame("Space Shooter");
和
frame.add(alienAttack);
您不能简单地将另一个 JFrame 添加到您的第一个 JFrame 中。
事实是:任何 GUI 框架都有很多复杂性。因此:通过反复试验进行编程并不是一个合理的策略。
因此真正的答案是:退一步。你不应该做某事,因为你假设你可以做到。您必须花时间 了解 您在做什么。
在你的情况下:研究摇摆。 Oracle tutorials 是一个很好的起点。简单地说:从上到下阅读它们。阅读示例代码,复制它,并根据该工作代码进行实验。然后,当你对 Swing 足够熟练到 "walk on your on legs" 时,再回头看看你当前的 applet-based 应用程序的结构。应用您学到的东西,并将您拥有的东西分解成您可以在 Swing 应用程序中 re-use 的那些部分。
根据上下文,这可能相当容易,例如:决定您的 "main" 框架 (window) 应该是什么,然后找出如何添加其他内容。我 猜测 第一次尝试是将 AlienAttack 从 JFrame 更改为 JPanel。您将 面板 添加到框架,而不是框架!
所以我正在制作游戏,我想将其从小程序切换到 JFrame,因为我的所有其他 classes 都使用 JFrame。但是,我不断收到一堆我不理解的 运行 时间错误。
我主要尝试将 extends Applet
替换为 'extends JFrame',并制作另一个 class,其中包含游戏的所有内容,例如作为背景,运动,字面意思是整个游戏。
这是 classes 之一,我在其中声明了一个包含游戏其余部分的 JFrame:
public class SpaceGame{
JFrame frame = new JFrame("Space Shooter");
AlienAttack alienAttack = new AlienAttack();
public SpaceGame(){
frame.setBounds(320, 25, 1000, 650);
frame.setResizable(false);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.add(alienAttack);
}
}
这是您在上面看到的 AlienAttack class:
public class AlienAttack extends JFrame implements KeyListener, Runnable
{
double xVel; double yVel; final double SPEED = 0.02;
Thread thread;
int direction;
double x, y;
final double FRICTION = 0.98;
boolean upAccel, downAccel, leftAccel, rightAccel;
ArrayList<Shot> shots;
ArrayList<Alien> aliens;
boolean shipActive;
public void init(){
x=475;
y=300;
direction = 1;
xVel = 0; yVel = 0;
shipActive = true;
upAccel = false; downAccel = false; leftAccel = false; rightAccel = false;
shots = new ArrayList<Shot>();
aliens = new ArrayList<Alien>();
this.addKeyListener(this);
thread = new Thread(this);
thread.start();
}
还有更多内容,但这是我认为相关的内容。顺便说一句,Shot
和 Alien
是其他 classes,我在 ArrayLists 中使用它们。
我得到的一些错误是:
Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: adding a window to a container
(这是主要的)
t java.awt.Container.checkNotAWindow(Unknown Source)
at java.awt.Container.addImpl(Unknown Source)
at java.awt.Container.add(Unknown Source)
at javax.swing.JFrame.addImpl(Unknown Source)
at java.awt.Container.add(Unknown Source)
at SpaceGame.<init>(SpaceGame.java:11)
at TestingGrounds$SnakeHandler.actionPerformed(TestingGrounds.java:82)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
差不多一半了哈哈
简单:
JFrame frame = new JFrame("Space Shooter");
和
frame.add(alienAttack);
您不能简单地将另一个 JFrame 添加到您的第一个 JFrame 中。
事实是:任何 GUI 框架都有很多复杂性。因此:通过反复试验进行编程并不是一个合理的策略。
因此真正的答案是:退一步。你不应该做某事,因为你假设你可以做到。您必须花时间 了解 您在做什么。
在你的情况下:研究摇摆。 Oracle tutorials 是一个很好的起点。简单地说:从上到下阅读它们。阅读示例代码,复制它,并根据该工作代码进行实验。然后,当你对 Swing 足够熟练到 "walk on your on legs" 时,再回头看看你当前的 applet-based 应用程序的结构。应用您学到的东西,并将您拥有的东西分解成您可以在 Swing 应用程序中 re-use 的那些部分。
根据上下文,这可能相当容易,例如:决定您的 "main" 框架 (window) 应该是什么,然后找出如何添加其他内容。我 猜测 第一次尝试是将 AlienAttack 从 JFrame 更改为 JPanel。您将 面板 添加到框架,而不是框架!