Ошибка в апплете двойного назначения. Java.

338
23 сентября 2017, 21:53

Имеется сей код:

package labwork1;
import java.applet.*;
import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.net.MalformedURLException;
import java.net.URL;
import java.nio.file.Paths;
import java.util.logging.Level;
import java.util.logging.Logger;
import javafx.scene.shape.MoveTo;
import javax.swing.event.*;
/**
 *
 * @author xred
 */
public class Combi extends Applet{
    private boolean m_fStandAlone = false;
    int curX = 50, curY = 50;
    static boolean keyWasPressed = false;
    MouseInputAdapter p;
    KeyAdapter pk;
    Image image;
    public String m_FileName = "simple.jpeg";
    private final String PARAM_String_1 = "fileName";
    public Combi() {
        p = new MouseInputAdapter() {
            public void mousePressed(MouseEvent e){
                keyWasPressed = true;
                curX = e.getX();
                curY = e.getY();
                repaint();
            }};
        this.addMouseListener(p);
        pk = new KeyAdapter() {
        public void keyPressed(KeyEvent e){
            int keyCode = e.getKeyCode();
            keyWasPressed = true;
            switch(keyCode){
                case KeyEvent.VK_DOWN:
                    curY += 5;
                    repaint();
                    break;
                case KeyEvent.VK_UP:
                    curY -= 5;
                    repaint();
                    break;
                case KeyEvent.VK_RIGHT:
                    curX += 5;
                    repaint();
                    break;
                case KeyEvent.VK_LEFT:
                    curX -= 5;
                    repaint();
                    break;
            }
        }
        };
        this.addKeyListener(pk);
        image = null;
    }
    @Override
    public void init(){
            if (m_fStandAlone = false){
            String param;
            param = getParameter(PARAM_String_1);
            if (param != null) m_FileName = param;
        }  
           resize(600, 600);
    }
    public void start(){
        try {
            URL url = Paths.get("/home/xred/").toUri().toURL();
            image = getImage(url, m_FileName);
        } catch (MalformedURLException ex) {
            Logger.getLogger(Combi.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    public String[][] getParameterInfo() {
        String[][] info ={{ PARAM_String_1, "fileName", "name of file" },};
        return info;
    }
    public void paint(Graphics g){
        if (keyWasPressed)
            g.drawImage(image, curX, curY, this);
    }

    public static void main(String[] args) {
        Frame fr = new Frame("Апплет двойного назначения");
        Combi c = new Combi();
        c.m_fStandAlone = true;
        if (args.length != 0)
            c.m_FileName = args[0];
        c.init();
        fr.add(c);
        fr.setSize(600, 600);
        fr.setVisible(true);
        //fr.getToolkit().getImage(m_FileName);
        fr.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                System.exit(0); 
            }});
    }
}

Если запускать через Web Start, т.е только апплет - все в порядке. При попытке же запускать как приложение вылетает ошибка :

Exception in thread "main" java.lang.NullPointerException
at java.applet.Applet.getAppletContext(Applet.java:204)
at java.applet.Applet.getImage(Applet.java:276)
at java.applet.Applet.getImage(Applet.java:298)
at labwork1.Combi.start(Combi.java:88)
at labwork1.Combi.main(Combi.java:113)

Прошу помощи!

Answer 1

Когда класс Combi запускается из метода main, контекст выполнения апплета не существует, а метод Applet.getImage() пытается его получить. Попробуйте вместо него использовать метод Toolkit.getImage():

public class Combi extends Applet {
    private final Toolkit toolkit;
    ...
    public Combi() {
        toolkit = Toolkit.getDefaultToolkit();
        ...
    }
    ...
    public void start() {
        try {
            URL url = Paths.get("/home/xred/" + m_FileName).toUri().toURL();
            image = toolkit.getImage(url);
        } catch (MalformedURLException ex) {
            Logger.getLogger(Combi.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}
READ ALSO
Как достать дробные числа из файла?

Как достать дробные числа из файла?

Есть txt файл, в нем находятся слова, целые числа и дробные вперемешкуПодскажите, пожалуйста, как вытянуть оттуда только дробные числа?

397
Как создать в программе txt

Как создать в программе txt

Здравствуйте, у меня такой вопрос, как создать в программе текстовый файл, который после запуска появится в той директории в которой, открыл...

274
(x = x + y) или (x += y) — отличия в приведении типов

(x = x + y) или (x += y) — отличия в приведении типов

Столкнулся с таким вот свойством сложенияУ нас есть две переменные:

175
Вывод буквы при нажатий на кнопку

Вывод буквы при нажатий на кнопку

Добрый деньКак сделать типичный Logo quiz app, чтобы при нажатий на буквы textview заполнялся и проверял ответ

230