Klasse neuladen

Wolfy0013

Mitglied
Hallo erstmal.
Also als erstes muss ich sagen, dass ich mit Java zwar halbwegs anständig programmieren kann, allerdings keinerlei Ahnung der theoretischen Seite habe.
Ich bin mir zum Beispiel nicht einmal sicher was der Unterschied zwischen AWT und Swing ist und wusste deshalb auch nicht in welches Unterforum damit, wofür ich mich hier entschuldige.
Ich bin gerade dabei ein Spiel zu programmieren, bei dem an eine Klasse in der ich ein JFrame (=Mainklasse) erstelle, eine Klasse mit extends Canvas (=Gameklasse) hinzugefügt wird.
Nun wird nach einer beendeten Runde die Gameklasse von der Mainklasse removed und eine andere geadded. Nachher soll die Gameklasse wieder an die Mainklasse angefügt werden!
Mein Problem ist nun, dass die Klasse nicht neu gestartet wird, sondern alles so ist, wie ich sie ausgeblendet habe.
Meine Frage also: Gibt es eine Möglichkeit, die Klasse neu zu starten, bzw. zurückzusetzen oder zu beenden und dann wieder starten?
Versucht habe ich bereits, die Klasse neu zu definieren, was aber keinen Erfolg erzielt.
Code:
 game=new game(); //game--> Gameklasse, vorher global definiert


Ich bedanke mich im Voraus für alle Hilfestellungen,
Wolfy
 
Hallo Wolfy,

Die Swing Oberflächenkomponenten beginnen alle mit "J". Es ist zwar möglich, AWT und Swing Oberflächenkomponenten zu mischen, es wird aber generell nicht empfohlen. Daher würde ich "Canvas" eher als "JComponent" oder "JPanel" deklarieren.

Als die ursprüngliche AWT API für JDK 1.0 entwickelt wurde, gab es nur heavyweight Komponenten ("heavyweight" bedeutet, dass die Komponente ihr eigenes undurchlässiges natives Fenster hat).

Mit der Einführung der lightweight Komponenten in JDK 1.1 (eine "lightweight" Komponente ist eine, die das native Fenster ihres nächsten heavyweight Vorfahrs wiederverwendet), musste das AWT das Malen für lightweight Komponenten im gemeinsamen Java Code einführen. Somit gibt es feine Unterschiede bezüglich des Malvorgangs für heavyweight und lightweight Komponenten.

Nach dem JDK 1.1, als das Swing Toolkit freigegeben wurde, stellte dieses seine eigenen Malmechanismen vor. In den meisten Fällen ähnelt und beruht der Swing Malmechanismus auf dem AWT. Aber er führt auch einige Unterschiede bezüglich der Mechanismen ein, sowie neue APIs, mit denen die Anwendungen den Malvorgang einfacher anpassen können.

Wir empfehlen, daß Entwickler für die meisten GUI Bedürfnisse Gebrauch von Swing machen.

Gruß,
André
 
Zuletzt bearbeitet:
Danke, für den Tipp. Ich habe es mal auf mein Programm angewendet und sofort bemerkt, dass das Flackern, das mich ziemlich stört weg war.
Dann ist mir aufgefallen, dass der Keylistener (der MouseListener schon) plötzlich nicht mehr funktionierte (geadded mit this.addKeyListener(this)) und das Removen und Adden der Klassen mit extends JPanel ) nicht mehr richtig funktioniert:
Beim ersten Mal klicken (In einer Menü-Klasse, ebenfalls JPanel) zeigt er mir an, dass er die Klasse added, die Paint-Methode einmal aufruft, allerdings zeigt das Programm nichts an. Beim zweiten Mal nach Rückkehr in die Menüklasse geht dann nichts mehr. Er hört auf zu zeichen und malt weder in der Game noch in der Menuklasse.
Da scheint was an der Aktualisierung des JFrames zu hapern! Ich aktualisiere jetzt nach jedem Klassentausch mit fenster.setVisible(true).
Tipps.....?
Danke, Wolfy
 
Könntest du mal den Code zeigen?
Gerne, Hier die wichtigsten Auschnitte:

Code:
public class Main{
    static JFrame F;
    //static game game = new game();
    static menu menu = new menu();
    static options op;
    static shop shop;
    static game game;
    static int round=1;
   
    public static void changeCanvas(String name){
        System.out.println(name);

        if(name.equals("game")){ // VON MENU INS GAME
             F.remove(menu);
             int[] a = {0,0,0,0};
             game.setData(a,round);
             F.add(game);
             F.setVisible(true);
        }
               else if(name.equals("menu_g")){ //VOM GAME INS MENU
             F.remove(game);
             game.reset();
             F.add(menu);
             F.setVisible(true);
        }
        //.....
    }

       
    public static void main(String[] args) {
        op = new options();
        shop = new shop();
        game= new game();
//         try {
//             Runtime.getRuntime().exec("SetRes\\SetRes.exe h1024 v768");
//        } catch (IOException e) {e.printStackTrace();}
       
                F =new JFrame();
            //FENSTER OPTIONEN EINSTELLEN (GRÖßE...)
                F.add(menu);
                F.setVisible(true);
   
        }

In der Main erstelle ich das Fenster und eine Funktion, bei der ich mittels mitgegebenen String eine Klasse entferne und hinzufüge.

Aufrufen in den Klassen geschieht dann so per MouseListener:

Code:
public void mouse (MouseEvent e){
       
        if(collider.SimpleCollide(30,30,e.getX(),e.getY(),100,100)){ //RECHNET AUS, OB SICH DIE MAUS IN EINEM BESTIMMTEN RAHMEN BEFINDET (return boolean)
            Main.changeCanvas("game");  //Funktion
        }

Und nocheinmal: Mit CANVAS hat das alle wunderbar funktioniert!

Wolfy
 
Zuletzt bearbeitet:
Schau dir mal das CardLayout an.

Wow, das ging mal wirklich glatt! Danke! Allerdings ist da noch das Problem mit dem KeyListener, der keinerlei Reaktion zeigt.

Ich adde ihn wie erwähnt einfach bei starten der Klasse mit this.addKeyListener(this); während die Klasse über ein implements KeyListener verfügt.
 
Zuletzt bearbeitet von einem Moderator:
Zurück