【问题标题】:Trying to switch from applet to JFrame尝试从小程序切换到 JFrame
【发布时间】:2022-02-17 18:46:12
【问题描述】:

所以我正在制作一个游戏,我想将它从一个小程序切换到一个 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();
  }

还有更多,但这是我认为相关的内容。顺便说一句,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)

这就像他们中的一半哈哈

【问题讨论】:

    标签: java swing user-interface jframe applet


    【解决方案1】:

    简单:

    JFrame frame = new JFrame("Space Shooter");
    

    frame.add(alienAttack);
    

    您不能只是在第一个 JFrame 中添加另一个 JFrame。

    问题是:任何 GUI 框架都带有很多复杂性。因此:通过反复试验进行编程并不是一个合理的策略。

    因此,真正的答案是:退后一步。你不应该这样做,因为你假设你可以这样做。您必须花费所需的时间来了解您在做什么。

    在您的情况下:研究摆动。 Oracle tutorials 是一个很好的起点。简单地说:从上到下阅读它们。阅读示例代码,复制它,并根据该工作代码进行实验。然后,当您对 Swing 的熟练程度足以“用腿走路”时,再回来看看您当前基于 applet 的应用程序的结构。应用你学到的东西,并将你所拥有的东西分解成可以在 Swing 应用程序中重复使用的部分。

    根据上下文,这可能相当容易,例如:决定你的“主”框架(窗口)应该是什么,然后弄清楚如何添加其他东西。我会猜测第一次尝试是将您的 AlienAttack 从 JFrame 更改为 JPanel。您将面板添加到框架,而不是框架!

    【讨论】:

    • 哎呀!我在其他类中使用了面板,但出于某种愚蠢的原因,我在这里写了 JFrame 并没有注意到。我的愚蠢错误。在我修复它之后,程序运行了一半,它画得很奇怪,我的角色的路径基本上被画在了屏幕上,这是我现在唯一的问题。不过我会努力解决这个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-19
    • 1970-01-01
    • 2014-05-11
    • 2011-08-25
    • 2013-11-13
    • 2011-02-09
    • 1970-01-01
    相关资源
    最近更新 更多