Как я могу запустить апплет как приложение? - PullRequest
5 голосов
/ 30 мая 2011

У меня есть класс Applet, и я хочу, чтобы он работал как приложение, поэтому я написал следующий код:

public static void main(String args[]) {
JFrame app = new JFrame("Applet Container");
app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
app.setSize(200, 100);
Hangman applet = new Hangman();
applet.init();
app.setLayout(new BorderLayout());
app.setSize(500,500);
app.getContentPane().add(applet, BorderLayout.CENTER);
app.setVisible(true);
}

Примечание: Hangman - это класс апплета.И если я запускаю его, он работает нормально, но я стараюсь, чтобы он работал как приложение.

Когда я запускаю вышеупомянутый main, я получаю следующую ошибку:

Exception in thread "main" java.lang.NullPointerException
at java.applet.Applet.getCodeBase(Applet.java:152)
at Me.Hangman.init(Hangman.java:138)
at Me.Client.main(Client.java:54)
Java Result: 1

Эта ошибка произошла из этой строки в классе Hangman:

danceMusic = getAudioClip(getCodeBase(), "../../audio/dance.au");

Метод GetCodeBase () возвращает значение null, мне нужна помощь о том, как заставить этот метод работать должным образом или, возможно, заменить егос другим методом, который может получить доступ к моим файлам для получения ресурсов?

Заранее спасибо

Ответы [ 3 ]

2 голосов
/ 30 мая 2011

Апплеты имеют специальную среду выполнения. Если вы хотите, чтобы ваш код выполнялся также как приложение, вы не можете полагаться на ЛЮБУЮ функциональность, предоставляемую этой средой.

Очевидно, что вы используете апплет -специфическую функцию здесь. Вы должны найти способ сделать это в приложении, затем определить среду, в которой вы работаете, и использовать соответствующие методы.

Edit:

Вместо getCodeBase() я бы попробовал:

getClass().getProtectionDomain().getCodeSource().getLocation();

Но getAudioClip также определен в апплете, так что это тоже нельзя. Вместо java.applet.AudioClip вы должны использовать javax.sound.sampled API.

1 голос
/ 30 мая 2011

Используйте Hangman.class.getResource () или getResourceAsStream () для загрузки ресурсов. http://www.java2s.com/Code/JavaAPI/java.lang/ClassgetResourceStringnamerelativetotheclasslocation.htm

0 голосов
/ 04 ноября 2012

У меня похожая проблема, и я нашел следующее, которое хорошо работает для параметров, codeBase и getImage - я все еще ищу часть getAudioClip () ... было бы здорово, если бы было что-то вроде ImageIo для Аудио ....

// simulate Applet environment
Map<String, String> params = new HashMap<String, String>();
URL documentBase;

/**
 * set the parameter with the given name
 * 
 * @param name
 * @param value
 */
public void setParameter(String name, String value) {
    params.put(name.toUpperCase(), value);
}

@Override
public String getParameter(String name) {
    String result = null;
    if (params.containsKey(name))
        result = params.get(name);
    else {
        try {
            result = super.getParameter(name);
        } catch (java.lang.NullPointerException npe) {
            throw new IllegalArgumentException("parameter " + name + " not set");
        }
    }
    return result;
}

/**
 * @param documentBase
 *          the documentBase to set
 * @throws MalformedURLException
 */
public void setDocumentBase(String documentBase) throws MalformedURLException {
    this.documentBase = new URL(documentBase);
}

@Override
public URL getDocumentBase() {
    URL result = documentBase;
    if (result == null)
        result = super.getDocumentBase();
    return result;
}

@Override
public Image getImage(URL url) {
    Image result = null;
    if (this.documentBase != null) {
        try {
            result = ImageIO.read(url);
        } catch (IOException e) {
        }
    } else {
        result = super.getImage(url);
    }
    return result;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...