2015-04-13 4 views
0

Я новичок в программировании с помощью апплетов и хотел сделать апплет для размещения на веб-сайте. Итак, идем.java applet ExceptionInInitializerError

Целью этого проекта было то, что если вы нажмете кнопку, он откроет JFrame поверх браузера. но при тестировании он дает мне java.lang.ExceptionInInitializerError. Это исходный код:

public class LaunchMenu extends Applet { 

    public static LoginScreen login; 
    public static Game game; 
    public JButton button; 
    public void init() { 
     try {button= new JButton("Press this button to start"); 
     add(button); 

     button.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent arg0) { 
       login = new LoginScreen(); 

      } 
     }); 
     } catch (Exception e) { 
      e.getMessage(); 
      e.getCause(); 
     } 
    } 

    public void start() { 
     login = new LoginScreen(); 
    } 

    public void stop() { 
     login.dispose(); 
     game.stop(); 
    } 

    public static void main(String[] args) { 

    } 

} 

Примечание: Это работает в Eclipse, с его окно апплета, но не на сайте.

редактировать:

Exception in thread "AWT-EventQueue-2" java.lang.IllegalStateException: Applet's parent container not set up 
    at sun.plugin2.applet.Plugin2Manager.start(Unknown Source) 
    at sun.plugin2.main.client.PluginMain$StartAppletRunner.run(Unknown Source) 
    at java.awt.event.InvocationEvent.dispatch(Unknown Source) 
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source) 
    at java.awt.EventQueue.access$500(Unknown Source) 
    at java.awt.EventQueue$3.run(Unknown Source) 
    at java.awt.EventQueue$3.run(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) 
    at java.awt.EventQueue.dispatchEvent(Unknown Source) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
    at java.awt.EventDispatchThread.run(Unknown Source) 
CacheEntry[http://localhost/AppletTest/Applet.jar]: updateAvailable=true,lastModified=Mon Apr 13 12:24:52 CEST 2015,length=5051938 
+0

Трассировка стека была бы полезна? – Oli

+0

1) Зачем нужен апплет? Если это связано с тем, что учитель указал на это, обратитесь к [Почему учителя CS должны ** останавливаться ** преподавать Java-апплеты] (http://programmers.blogoverflow.com/2013/05/why-cs-teachers-should -stop-учебно-ява-апплеты /). 2) Зачем использовать AWT? См. [Этот ответ] (http://stackoverflow.com/questions/6255106/java-gui-listeners-without-awt/6255978#6255978) по многим причинам, чтобы отказаться от использования AWT с использованием компонентов в пользу Swing. –

+0

@AndrewThompson ответить на ваш первый вопрос; причина, по которой я использую апплет, - это то, что я работаю над проектом с кем-то. Он делает сайт, и я делаю связанную с Java вещь. И, чтобы разместить его в Интернете, я использую апплет. (Единственное, что я знаю, чтобы положить его в Интернет) :) И для вашего второго вопроса: не поймите меня неправильно, я использую качели в сочетании с AWT. Swing для всех визуальных частей и awt для ActionListeners & ItemsListeners;), поскольку это невозможно сделать. _ _ – Deadrow

ответ

1

Ok Я установил мою проблему. Вот решение, которое сработало для меня.

SourceCode остается неизменным (за незначительные изменения за исключением) *:

public class LaunchMenu extends Applet { 

    public static LoginScreen login; 
    public static Game game; 
    public JButton button; 
    public void init() { 
     try {button= new JButton("Start the game"); 
     add(button); 

     button.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent arg0) { 
       login = new LoginScreen(); 
       login.setVisible(true); * 

      } 
     }); 
     } catch (Exception e) { 
      e.getMessage(); 
      e.getCause(); 
     } 
    } 

    public void start() { 
     login = new LoginScreen(); 
    } 

    public void stop() { 
     login.dispose(); 
     game.stop(); 
    } 

    public static void main(String[] args) { 

    } 
} 

Но я добавил java.policy файл в той же папке, что и апплета. В этом файле я написал следующий код:

grant { 
     permission java.security.AllPermission; 
}; 

После этого была установка, я побежал в другую проблему под названием java.lang.RuntimePermission: "exitVM.0"

Решение этой проблемы было просто. В классе с моим JFrame, в моем случае LoginScreen, был код строки setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);. Удалите это или прокомментируйте это, это сработало для меня, и теперь мой апплет виден и открывается рамка Login. который был всем, в чем я нуждался.

Надеюсь, это поможет многим людям с той же проблемой.

+0

* «Но я добавил файл« java.policy »..» * Апплет должен быть подписан в цифровом виде, прежде чем его можно будет запустить в Интернете (или с помощью Java Web Start). Вероятно, лучше всего понять это сейчас и добавить его в сборку для проекта. –

+0

* ".. был строковый код' setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); '. Удалить это или прокомментировать его .." * Было бы лучше изменить его на 'setDefaultCloseOperation (JFrame.DISPOSE_ON_CLOSE);'. Таким образом, когда виртуальная машина апплета заканчивается, она может нормально закрыться.(** ** по умолчанию ** - 'DO_NOTIHNG_ON_CLOSE', который скрывает рамку, но оставляет ее в памяти, тикает). –