2012-06-24 3 views
3

Хорошо, поэтому мне было интересно, может ли кто-нибудь сказать мне, где я иду не так.Внедрение JApplet в JFrame

У меня есть JApplet называется игра, которая отлично работает, если я запускаю ее из затмения, используя AppletViewer и JFrame, называемый GUI, который содержит JApplet. Вот код для обоих:

PS. я избавился от большей части кода от игры, чтобы сделать его меньше, теперь он просто базовый.

Game.java:

package com.ion.brickdodge; 

import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.Image; 

import javax.swing.JApplet; 


public class Game extends JApplet implements Runnable{ 

private static final long serialVersionUID = 1L; 
Image man1; 
Image man2; 
Image cman; 
int WIDTH = 250; 
int HEIGHT = 350; 
int lives = 3; 
int spx = WIDTH/2; 
int score = 0; 

Image dbImage; 
Graphics dbg; 

public void init() { 
    setSize (WIDTH, HEIGHT); 
    setFocusable(true); 
    setBackground(Color.LIGHT_GRAY); 

    man1 = getImage(getCodeBase(), "res/man1.png"); 
    man2 = getImage(getCodeBase(), "res/man2.png"); 

    cman = man1; 

} 

public void start() { 
    Thread th = new Thread(this); 
    th.start(); 
} 

public void run() { 
    Thread.currentThread().setPriority(Thread.MIN_PRIORITY); 
    while(true){ 
     repaint(); 

     try { 
      Thread.sleep(10); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 

     Thread.currentThread().setPriority(Thread.MAX_PRIORITY); 
    } 
} 

public void paint(Graphics g) { 

    g.drawImage(cman, spx, 320, this); 
    g.setColor(Color.BLACK); 
    g.drawString("Score: " + score, 5, 10); 
    g.drawString("Lives: " + lives, 5, 25); 

} 

public void update(Graphics g){ 
    if (dbImage == null) 
    { 
     dbImage = createImage (this.getSize().width, this.getSize().height); 
     dbg = dbImage.getGraphics(); 
    } 

    dbg.setColor (getBackground()); 
    dbg.fillRect (0, 0, this.getSize().width, this.getSize().height); 

    dbg.setColor (getForeground()); 
    paint (dbg); 

    g.drawImage (dbImage, 0, 0, this); 
} 
    } 

А вот GUI.java:

package com.ion.brickdodge; 

import java.awt.BorderLayout; 

import javax.swing.JApplet; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 


public class GUI { 

public static void main(String args[]) { 
     JFrame frame = new JFrame("test"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setSize(1000, 1000); 

     JPanel panel = new JPanel(new BorderLayout()); 
     frame.add(panel); 

     JApplet applet = new Game(); 
     panel.add(applet, BorderLayout.CENTER); 
     applet.init(); 
     frame.pack(); 

     frame.setVisible(true); 
    } 
} 

Ошибка GUI.java бросает, когда я запускаю это ...

Exception in thread "main" java.lang.NullPointerException 
at java.applet.Applet.getCodeBase(Unknown Source) 
at com.ion.brickdodge.Game.init(Game.java:30) 
at com.ion.brickdodge.GUI.main(GUI.java:22) 

Любая помощь будет очень признана

+0

Почему вы пытаетесь это сделать? почему бы просто не создать свой класс JPanel, а затем использовать его как апплет или рабочий стол, как вам хочется, просто поместив его в JApplet или JFrame по мере необходимости? –

+0

Ваш NPE, вероятно, генерируется 'man1 = getImage (getCodeBase()," res/man1.png ");' –

+0

Являются ли файлы изображений в том же каталоге, что и сам апплет? – fireshadow52

ответ

3

I Я сделаю это ответом: я думаю, что лучшим решением является передача вашего GUI в сторону создания JPanels. Затем, если вы хотите запустить графический интерфейс в виде апплета, вы можете просто создать свой JPanel и поместить его в панель содержимого JApplet. Аналогично, если вы хотите создать JFrame, создайте свой JPanel и поместите его в панель содержимого JFrame.

Другие вопросы:

  • рассмотреть возможность получения изображений в качестве ресурсов, как они, скорее всего, будет проходить в файле JAR.
  • Не рисуйте непосредственно в окне верхнего уровня, таком как JApplet, и не используйте метод рисования.
  • Вместо этого нарисуйте переопределенный JPanel метод paintComponent(...). Это позволит вашему коду использовать двойную буферизацию Swing.
  • Не переопределяйте update(...) в графическом интерфейсе Swing. Это делается для AWT, но его следует избегать для Swing.
  • Не читайте никаких изображений и не делайте никаких других интенсивных действий, связанных с процессором, в рамках метода рисования.
  • Ознакомьтесь с учебниками по рисованию Swing, чтобы посмотреть, как нужно делать такое кодирование. Вы можете найти вводный учебник here и более продвинутую статью here
+0

ОК им все еще немного запутано Игра представляет собой апплет, потому что ему нужно запускать на веб-страницах, но мне нужно было сделать отдельное приложение для этой конкретной игры. Я думал, что могу изменить его на JApplet и просто включить его в JFrame, но разве это невозможно? –

+0

Возможно, но неудобно. Вам все равно понадобится создать JPanel или JComponent с помощью 'paintComponent (...)' override, чтобы сделать ваш рисунок. Прошли ли вы через обучающие программы графики Swing (я бы предположил, что не указан ваш код). Подумайте об этом, прежде чем двигаться слишком далеко вперед в этом проекте. –

+0

@ Лукас: см. Править для ссылок на учебные пособия. –

3

Примечание: Если вопрос был «? Почему это происходит» ответ будет состоять в том, что JVM автоматически настраивает контекст апплета и закрывает апплет. Но этого не происходит, если апплет не загружен на веб-странице. Если вы загружаете его самостоятельно, вам необходимо внедрить, создать экземпляр &.

Это не очень сложно сделать, если у вас есть детали, обычно поставляемые элементом апплета.

(OTOH лучшая стратегия заключается в преобразовании игру на панели, поместите его в рамку, и запустить его с помощью JWS.)