[JAVA] Programm wird nicht gestartet...

Gruß Thomas!

Grand Admiral Special
Mitglied seit
27.03.2008
Beiträge
2.027
Renomée
118
Standort
Bayreuth
  • Docking@Home
So, hab heute mal bisschen an meinem Spiel weitergeschrieben, und wenn ich das Spiel in BlueJ/Netbeans starte, funktioniert alles ohne Probleme, aber sobald ich die JAR Datei starten will geht nichts (Prozess erscheint, aber Anzeige nicht)... Woran liegt das?

PHP:
/**
 */
import javax.swing.*;
import javax.swing.text.*;
import java.util.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class GUISP extends JFrame
{
    private JPanel gamePanel;
    private JPanel mainPanel;
    private JTextPane information;
    private JMenuBar mainMenuBar;
    private JMenu gameMenu;
    private JMenu helpMenu;
    private JMenu controlsMenu;
    private JMenuItem gameMenuNewGameItem;
    private JMenuItem helpMenuCreditsItem;
    private JMenuItem controlsMenuAbortItem;
    private JMenuItem controlsMenuUnClickItem;
    private Main_Master main;
    private JButton playfield[][];
    private Unit[][] unit;
    private GUIWorker guiworker;
    

    public GUISP()
    {
        super("WarGame SinglePlayer");
        initGUI();
        guiworker = new GUIWorker();
    }
    
    private void initGUI()
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            public void run()
            {
                main = new MainSP();
                unit = main.getUnitArray();
                playfield = new JButton[unit.length][unit[0].length];
                gamePanel = new JPanel();
                mainPanel = new JPanel();
                mainMenuBar = new JMenuBar();
                gameMenu = new JMenu("Game");
                gameMenuNewGameItem = new JMenuItem("Neues Spiel");
                helpMenu = new JMenu("Hilfe");
                helpMenuCreditsItem = new JMenuItem("Credits");
                controlsMenu = new JMenu("Aktion");
                controlsMenuAbortItem = new JMenuItem("Bewegung abbrechen");
                controlsMenuUnClickItem = new JMenuItem("Einheit abwählen");
                information = new JTextPane();
                information.setText("Spieler" + main.getCurrentPlayer() + ": " + "Bewegungsphase");
                createPlayfield();
                gamePanel.setLayout(new GridLayout(unit.length, unit[0].length));
                gameMenuNewGameItem.addActionListener(new ActionListener() {
                    public void actionPerformed(ActionEvent evt) {
                        newGameClicked();
                    }
                });
                helpMenuCreditsItem.addActionListener(new ActionListener() {
                    public void actionPerformed(ActionEvent evt) {
                        creditsClicked();
                    }
                });
                controlsMenuAbortItem.addActionListener(new ActionListener() {
                    public void actionPerformed(ActionEvent evt) {
                        abortClicked(evt);
                    }
                });
                controlsMenuUnClickItem.addActionListener(new ActionListener() {
                    public void actionPerformed(ActionEvent evt) {
                        unClick();
                    }
                });
                gameMenu.add(gameMenuNewGameItem);
                helpMenu.add(helpMenuCreditsItem);
                controlsMenu.add(controlsMenuAbortItem);
                controlsMenu.add(controlsMenuUnClickItem);
                mainMenuBar.add(gameMenu);
                mainMenuBar.add(helpMenu);
                mainMenuBar.add(controlsMenu);
                mainPanel.setLayout(new BorderLayout());
                mainPanel.add(mainMenuBar, BorderLayout.NORTH);
                mainPanel.add(gamePanel, BorderLayout.CENTER);
                mainPanel.add(information, BorderLayout.SOUTH);
                getContentPane().add(mainPanel);
                setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                pack();
                setIconImage(new ImageIcon(getClass().getResource("images/archer.gif")).getImage());
                setResizable(false);
                setLocationRelativeTo(null);
                setVisible(true);
            }
        });
    }
    
    public Main_Master getMain()
    {
        return main;
    }
    
    public void buttonActionPerformed(ActionEvent evt, int x, int y)
    {
         JButton button = (JButton) evt.getSource();
         guiworker.buttonActionPerformed(playfield, button, information, main, controlsMenuAbortItem, x, y);
    }
   
    private void createPlayfield()
    {
        for(int i = 0; i < playfield.length; i++)
        {
            for(int j = 0; j < playfield[0].length; j++)
            {
                String picture;
                if(unit[i][j] != null)
                    {   
                        picture = unit[i][j].getImage();
                    }
                    else
                    {
                        picture = "images/idle.gif";
                    }
                    playfield[i][j] = new JButton(new ImageIcon(getClass().getResource(picture)));
                    playfield[i][j].setBorder(new javax.swing.border.EmptyBorder(new java.awt.Insets(1, 1, 1, 1)));
                    if(unit[i][j] != null)
                    {
                        playfield[i][j].setToolTipText("<html>" + unit[i][j].getType() + "<br> HP: " + unit[i][j].getHp() + "<br> Damage: " + unit[i][j].getAttack() + "<br> Defense: " + unit[i][j].getDefense() + "<br> Range: " + unit[i][j].getRange() + "<br> Max. Movement: " + unit[i][j].getMovementmax());
                    }
                    else
                    {
                        playfield[i][j].setToolTipText("empty");
                    }
                    final int x, y;
                    x = i;
                    y = j;
                    playfield[i][j].addActionListener(new ActionListener() {
                        public void actionPerformed(ActionEvent evt) {
                            buttonActionPerformed(evt, x, y);
                        }
                    });
                    gamePanel.add(playfield[i][j]);
                }
          }
      }
   
   public void newGameClicked()
   {
       MainSP xMain = new MainSP();
       main = xMain;
       unit = main.getUnitArray();
       guiworker.resetPlayField(playfield, main, information, controlsMenuAbortItem);
   }
      
   public void creditsClicked()
   {
       Credits credits = new Credits();
   }
   
   public void abortClicked(ActionEvent evt)
   {
       guiworker.abortClicked(playfield, main, information, controlsMenuAbortItem);
   }
   
   public void unClick()
   {
       guiworker.unClick(playfield, main, information);
   }
  
    public static void main(String args[])
    {
       GUISP gui = new GUISP();
    }
}
PHP:
/**
 */
import javax.swing.*;
import javax.swing.text.*;
public class GUIWorker
{
    private int fromX;
    private int fromY;
    private JButton from;

    public GUIWorker()
    {
        
    }

    public void buttonActionPerformed(JButton playfield[][], JButton button, JTextPane information, Main_Master main, JMenuItem abortItem, int x, int y)
    {
       String picture;
       Unit[][] unit = main.getUnitArray();
       boolean help = false;
       if(main.isClicked()==false)
       {
            main.click(x,y);
            from = button;
            fromX = x;
            fromY = y;
            if(main.isClicked()==true)
            {
                information.setText("Spieler" + main.getCurrentPlayer() + ": " + main.getUnitArray()[fromX][fromY].getType() + " auf [" + (fromX + 1) + "] " + "[" + (fromY + 1) + "] wurde angewählt");
                displayRange(main, playfield, x, y);
            }
       }
       else if(main.getMovement()==1)
       {
            help = main.moveAllowed(x,y);
            main.move(x,y);
            if((fromX == x) && (fromY == y))
            {
                main.abortMovement();
                information.setText("Spieler" + main.getCurrentPlayer() + ": " + "Angriffsphase");
            }
            else
            {
                 if(unit[x][y] != null)
                 {
                     picture = unit[x][y].getImage();
                     button.setIcon(new ImageIcon(getClass().getResource(picture)));
                     button.setToolTipText(from.getToolTipText());
                     button.validate();
                     if(help == true)
                     {
                         from.setIcon(new ImageIcon(getClass().getResource("images/idle.gif")));
                         from.setToolTipText("empty");                
                         from.validate();
                         information.setText("Spieler" + main.getCurrentPlayer() + ": " + "Angriffsphase");
                     }
                     else
                     {
                         information.setText("Spieler" + main.getCurrentPlayer() + ": " + "Bewegungsphase");
                     }
                  }
                  else
                  {
                      information.setText("Spieler" + main.getCurrentPlayer() + ": " + "Bewegungsphase");
                  }
            }
            displayPlayfield(playfield, main);
       }
       else if(main.getMovement()==0)
       {
            if((fromX == x) && (fromY == y))
            {
                main.abortAttack();
                information.setText("Spieler" + main.getCurrentPlayer() + ": " + "Bewegungsphase");
            }
            else
            {
                help = main.attackAllowed(x,y);
                main.attack(x,y);
                if(unit[x][y] != null)
                {
                    picture = unit[x][y].getImage();
                }
                else
                {
                    picture = "images/idle.gif";
                }
                if(unit[x][y] != null)
                {
                    button.setToolTipText("<html>" + unit[x][y].getType() + "<br> HP: " + unit[x][y].getHp() + "<br> Damage: " + unit[x][y].getAttack() + "<br> Defense: " + unit[x][y].getDefense() +  "<br> Range: " + unit[x][y].getRange() + "<br> Max. Movement: " + unit[x][y].getMovementmax());
                }
                else
                {
                    button.setIcon(new ImageIcon(getClass().getResource(picture)));
                    button.setToolTipText("empty");
                }
                if(help == true)
                {
                    information.setText("Spieler" + main.getCurrentPlayer() + ": " + "Bewegungsphase");
                }
                else
                {
                    information.setText("Spieler" + main.getCurrentPlayer() + ": " + "Angriffsphase");
                }
            }
            displayPlayfield(playfield, main);
       }
       changeText(main, abortItem);
    }

    public void abortClicked( JButton[][] playfield, Main_Master main, JTextPane information, JMenuItem abortItem)
    {
        if(main.getMovement()==1)
        {
            main.abortMovement();
            information.setText("Spieler" + main.getCurrentPlayer() + ": " + "Angriffsphase");
        }
        else if(main.getMovement()==0)
        {
            main.abortAttack();
            information.setText("Spieler" + main.getCurrentPlayer() + ": " + "Bewegungsphase");
        }
        changeText(main, abortItem);
        displayPlayfield(playfield, main);
        unClick(playfield, main, information);
    }
    
    private void changeText(Main_Master main, JMenuItem abortItem)
    {
        if(main.getMovement()==1)
        {
            abortItem.setText("Bewegung abbrechen");
        }
        else
        {
            abortItem.setText("Angriff abbrechen");
        }
    }
    
    private void displayRange(Main_Master main, JButton[][] playfield, int x, int y)
    {
        Unit[][] unit = main.getUnitArray();
        for(int i = 0; i < playfield.length; i ++)
        {
            for(int j = 0; j < playfield[0].length; j++)
            {
                String picture;
                if(main.getMovement() == 1)
                {
                    if(main.moveAllowed(i,j))
                    {
                        picture = "images/idle_moveRange.gif";
                        playfield[i][j].setIcon(new ImageIcon(getClass().getResource(picture)));
                    }
                }
                else
                {
                    if(main.attackAllowed(i,j))
                    {
                        if(unit[i][j] != null)
                        {
                            picture = unit[i][j].getImageRange();
                            playfield[i][j].setIcon(new ImageIcon(getClass().getResource(picture)));
                        }
                    }
                }
            }
        }
                        
                        
    }
    
    private void displayPlayfield(JButton[][] playfield, Main_Master main)
    {
        Unit[][] unit = main.getUnitArray();
        for(int i = 0; i < playfield.length; i++)
        {
            for(int j = 0; j < playfield[0].length; j++)
            {
                String picture;
                if(unit[i][j] != null)
                {   
                        picture = unit[i][j].getImage();
                }
                else
                {
                    picture = "images/idle.gif";
                }
                playfield[i][j].setIcon(new ImageIcon(getClass().getResource(picture)));
                if(unit[i][j] != null)
                {
                    playfield[i][j].setToolTipText("<html>" + unit[i][j].getType() + "<br> HP: " + unit[i][j].getHp() + "<br> Damage: " + unit[i][j].getAttack() + "<br> Defense: " + unit[i][j].getDefense() + "<br> Range: " + unit[i][j].getRange() + "<br> Max. Movement: " + unit[i][j].getMovementmax());
                }
                else
                {
                    playfield[i][j].setToolTipText("empty");
                }
            }
         }
     }
    
    public void resetPlayField(JButton[][] playfield, Main_Master main, JTextPane information, JMenuItem abortItem)
    {
         displayPlayfield(playfield, main);
         information.setText("Spieler" + main.getCurrentPlayer() + ": " + "Bewegungsphase");
         changeText(main, abortItem);
    }
    
    public void unClick(JButton[][] playfield, Main_Master main, JTextPane information)
    {
        main.unClick();
        if(main.getMovement() == 1)
        {
            information.setText("Spieler" + main.getCurrentPlayer() + ": " + "Bewegungsphase");
        }
        else
        {
            information.setText("Spieler" + main.getCurrentPlayer() + ": " + "Angriffsphase");
        }
        displayPlayfield(playfield, main);
    }
}

Link zur JAR-Datei:

http://www.compuplace.de.vu/Downloadbereich/WarGame_v0_4.jar

Und noch ein zweites Problem:

Der SoundPlayer spielt manchmal einen Sound nur kurz an, stockt und hört auf, woran liegt das?

PHP:
/**
 */
import javax.swing.*;
import java.applet.*;
import java.net.URL;
public class SoundPlayer
{



    public SoundPlayer()
    {
        
    }

    public void play(final String title)
    {        
        SwingUtilities.invokeLater(new Runnable()
        {
            public void run()
            {
                try
                {
                    AudioClip sound = Applet.newAudioClip(getClass().getResource(title)); 
                    sound.play();
                }
                catch(Exception e)
                {
                }
            }
        });
    }
}

Ich hoffe, ihr könnt mir helfen...
 
Zuletzt bearbeitet:
Kann der Spaß an ner kaputten JDK liegen?
 
Kann mir bitte wer helfen?
 
kenn mich mit java nicht so wirklich gut aus, aber erzähl doch mal wie deiner meinung nach das programm ablaufen sollte, und vergleich es damit, wie es wirklich abläuft...
 
Naja es startet nicht und sollte eigentlich starten? Das Programm ist ja nicht das Problem, sondern der Compiler...
 
du benutzt verschiedene?

(ich glaube nicht dass es am "compiler" liegt)
 
Naja... Es kann ja nicht am Programmliegen, das den Code in die .jars packt (NetBeans und BlueJ gehen beide nicht). Aber wenn ich das Spiel in der IDE starte funktioniert alles...?

Außerdem funktioniert die .jar auch auf anderen Rechnern nicht :(
 
ich versteh nicht was du meinst...

aber warum benutzt du z.b. invokeLater?
 
Fürs Multithreading?
 
Naja, das Spiel frisst mittlerweile richtig Rechenleistung, und das obwohl es nicht groß ist...

Auf unseren Schulrechnern hab ichs mal gestartet und das hat ziemlich lange gedauert. Deswegen sind jetzt alle rechenintensiven Aufrufe in Threads ausgelagert...
 
Ist er doch, aber nicht mehr aktuell...

Was hat das bitte mit den Threads zu tun? Ich hatte vorher schon viele Versionen die genau dieselben Threads hatten, aber ohne Probleme funktioniert haben...

P.S.: Ich bin kein Java Vollnoob :] (sonst wäre das Game schon vorher ein hoffnungsloser Fall gewesen...)
 
Mit welchen Parametern muss man das .jar bzw. die javaw.exe starten? Bei mir kommt immer "Could not find the main class. Program will exit." und ich hab's wie folgt probiert:
Code:
javaw WarGame_v0_4.jar
javaw.exe -jar WarGame_v0_4.jar
Um rauszufinden, was NetBeans anders macht als das manuelle Starten, ist ProcessExplorer übrigens sehr hilfreich: dort kann man sich die Kommandozeilenparameter jedes Prozesses anschauen.

MfG Dalai
 
Naja bei mir kommt keine Fehlermeldung bei deinen Versionen, passieren tut aber nichts???

EDIT:

Ahhh, bei der ersten Version schon...

Und das hier steht in der MANIFEST.MF:

PHP:
Manifest-Version: 1.0
Class-Path: 
Main-Class: GUISP

EDIT2:

Vorher lief des aber immer ohne Probleme...
 
Zuletzt bearbeitet:
Ich hab keine große Ahnung von Java-Programmierung, ich wollte einfach nur mal schauen, ob das Programm bei mir etwas tut. Übrigens habe ich nur JRE 1.5.0_22 installiert, falls deine Anwendung also Java6 voraussetzen sollte, ist es klar, dass es bei mir nicht funzt ;).

MfG Dalai
 
Nein voraussetzen tut sie glaub ich 1.4.2, wenn ich jetzt nicht alles verblödelt hab xD.

Scheint also doch was am .jar Erstellen zu haken...
 
wenn das bild fehlt scheint im übrigen ne NPE geworfen zu werden (deshalb kann ichs net starten, hätte ich vllt. vorher mal probieren sollen ;-))
 
Häh, wo wird n Nullpointer geworfen? Wäre nett, wenn du mir sagst, wo einer geworfen werden sollte.

Screenshot (wie es sein sollte) kommt gleich...

EDIT: So schauts aus, wenn ich in BlueJ die main-Methode aufrufe...

WarGameEntwicklung.jpg
 
Zuletzt bearbeitet:
wird geworfen wenn die bilder net gefunden werden... wie schon gesagt.
(tipp: suche ImageIcon)
 
Zuletzt bearbeitet:
Code:
[bernd@charlotte ~]$ java -jar Downloads/WarGame_v0_4.jar 
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
	at javax.swing.ImageIcon.<init>(ImageIcon.java:155)
	at GUISP$1.run(GUISP.java:99)
	at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:226)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:602)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:275)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:200)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:190)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:185)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:177)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:138)
^C[bernd@charlotte ~]$ java -version
java version "1.6.0_17"
OpenJDK Runtime Environment (IcedTea6 1.7.1) (fedora-37.b17.fc13-i386)
OpenJDK Server VM (build 14.0-b16, mixed mode)
 
Code:
[bernd@charlotte ~]$ java -jar Downloads/WarGame_v0_4.jar 
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
	at javax.swing.ImageIcon.<init>(ImageIcon.java:155)
	at GUISP$1.run(GUISP.java:99)
	at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:226)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:602)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:275)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:200)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:190)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:185)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:177)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:138)
^C[bernd@charlotte ~]$ java -version
java version "1.6.0_17"
OpenJDK Runtime Environment (IcedTea6 1.7.1) (fedora-37.b17.fc13-i386)
OpenJDK Server VM (build 14.0-b16, mixed mode)

Ok danke :). Aber warum hat des nichts angezeigt bei mir?

Ok, der Thread war ne Farce... Es lag hier dran und es war wie immer ein Verschreibfehler, die Datei heißt "Archer.gif" und nicht "archer.gif". Aber komisch, dass es unter BlueJ ohne Murren ging...

PHP:
setIconImage(new ImageIcon(getClass().getResource("images/archer.gif")).getImage());
 
Zuletzt bearbeitet:
So sorry hab den Thread schon von Anfang an mitverfolgt. Habe das Problem auch sofort gefunden nur mal wieder nicht meine Logindaten für P3dNow gefunden. :D
(Ich hasse all diese blöden Registrier-Seiten! Viel zu kompliziert wenn man auf mehreren Rechnern oder OS-Installationen/Accounts unterwegs ist).
In BlueJ oder Netbeans funktioniert es deswegen weil alle Dateien auf dem Dateisystem des Betriebssystems vorliegen. Windows ist da nicht so genau was die Großkleinschreibung angeht. Wenn du das in ein jar packst wird es in der Regel nur von der JVM verstanden und die unterscheidet zwischen Groß- und Kleinschreibung.
Ich habe das jar einfach entpackt und mir dieses Manifest rausgesucht und dann alles manuell gestartet um das herauszubekommen. Source war ja auch gleich mit enthalten.
Übrigens glaube ich gesehen zu haben, dass du dich nicht so ganz genau an die Java Vorgaben/Empfehlungen zur GUI-Entwicklung hältst. Ich vermute, dass es genau daran liegt warum dein Programm unendlich ressourcenhungrig zu sein scheint.
 
So sorry hab den Thread schon von Anfang an mitverfolgt. Habe das Problem auch sofort gefunden nur mal wieder nicht meine Logindaten für P3dNow gefunden. :D
(Ich hasse all diese blöden Registrier-Seiten! Viel zu kompliziert wenn man auf mehreren Rechnern oder OS-Installationen/Accounts unterwegs ist).
In BlueJ oder Netbeans funktioniert es deswegen weil alle Dateien auf dem Dateisystem des Betriebssystems vorliegen. Windows ist da nicht so genau was die Großkleinschreibung angeht. Wenn du das in ein jar packst wird es in der Regel nur von der JVM verstanden und die unterscheidet zwischen Groß- und Kleinschreibung.
Ich habe das jar einfach entpackt und mir dieses Manifest rausgesucht und dann alles manuell gestartet um das herauszubekommen. Source war ja auch gleich mit enthalten.
Übrigens glaube ich gesehen zu haben, dass du dich nicht so ganz genau an die Java Vorgaben/Empfehlungen zur GUI-Entwicklung hältst. Ich vermute, dass es genau daran liegt warum dein Programm unendlich ressourcenhungrig zu sein scheint.

Naja von unendlich kann man nicht sprechen. Hättest du n paar Links für JAVA-Konforme GUI-Entwicklung?
 
Zurück
Oben Unten