Попытка переключиться с апплета на JFrame - PullRequest
1 голос
/ 03 июня 2019

Итак, я делаю игру и хочу переключить ее с апплета на JFrame, так как все мои другие классы используют JFrames.Тем не менее, я продолжаю получать кучу ошибок во время выполнения, которые я вообще не понимаю.

Я в основном пытался просто заменить, где написано extends Applet на 'extends 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();
  }

Это еще не все, но я думаю, что это важно.Кстати, Shot и Alien - это другие классы, я использую их в 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)

Это как половина из них LOL

1 Ответ

3 голосов
/ 03 июня 2019

Простой:

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

и

frame.add(alienAttack);

Вы просто не можете просто добавить еще один JFrame в свой первый.

Дело в том, что любая GUI-инфраструктура имеет большую сложность.Как следствие: программирование методом проб и ошибок не является разумной стратегией.

Поэтому реальный ответ: шаг назад.Вы не должны ничего делать, потому что вы предполагаете, что вы можете сделать это.Вы должны потратить часы, которые требуются, чтобы понять , что вы делаете.

В вашем случае: исследовательский свинг.Учебные руководства по Oracle являются хорошей отправной точкой.Проще говоря: читайте их сверху вниз.Прочитайте пример кода, скопируйте его и проведите эксперименты на основе этого рабочего кода.Затем, когда вы достаточно опытны в Swing, чтобы «ходить на ногах», вернитесь и посмотрите на структуру вашего текущего приложения, основанного на апплетах.Примените то, что вы узнали, и разбейте то, что у вас есть, на те части, которые вы затем сможете использовать в приложении Swing.

В зависимости от контекста это может быть довольно просто, например: решить, что у вас "главноеРамка (окно) должна быть, чтобы потом выяснить, как добавить другие вещи.Я бы догадался , что первая попытка будет об изменении вашей атаки AlienAtack с JFrame на JPanel.Вы добавляете панели в рамку, а не в рамку!

...