因此,我正在制作一个游戏,我想将其从applet切换到JFrame,因为我所有其他类都使用JFrame。但是,我不断收到一堆我不明白的运行时错误。

我主要尝试过只是替换说extends Applet的地方以“扩展JFrame”,并制作另一个类,在该类中它使JFrame包含游戏的所有内容,例如背景,运动以及整个游戏。

这是类之一,在其中我声明了一个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类:

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();
  }


还有更多内容,但这是我认为相关的内容。 BTW,ShotAlien是其他类,我在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来“走路”时,请返回并查看当前基于Applet的应用程序的结构。将学到的知识运用到其中,然后将自己拥有的东西分解成几部分,然后在Swing应用程序中重复使用。

根据上下文,这可能很容易,例如:确定“主”框架(窗口)应该是什么,然后找出如何添加其他内容。我猜想,第一个尝试是将AlienAttack从JFrame更改为JPanel。您将面板添加到框架,而不是框架!

09-10 02:29
查看更多