Application vernünftig darstellen und beenden

Status
Nicht offen für weitere Antworten.

Halo_Player

Mitglied
[Edit]: Sorry habe vorhin ausversehn im AWT, Swing und SWT Forum unangemeldet gepostet. Bitte löschen!

Hallo Leute hab mal wieder ne Frage und zwar schreibe ich zur Zeit eine Facharbeit in Informatik über das Thema "Pathfinding in Java" und hab hierzu follgendes Beispielapplet, dass den A*-Algorithmus simulieren soll:
Code:
import java.awt.*;
import java.awt.event.*;
import java.util.*;

public class A_Stern //implements KeyListener
{
  Vector offen=new Vector();
  Vector geschlossen=new Vector();
  Quadrat aktuell;

  Frame frame=new Frame();

  int size=32;
  int start,ziel;

  int[] matrix=new int[32*32];

  public static void main(String[] args) {A_Stern start=new A_Stern();}

  public A_Stern()
  {
     frame.setSize(960,960);
     Dimension d=Toolkit.getDefaultToolkit().getScreenSize();
     frame.setLocation((d.width-frame.getSize().width)/2,(d.height-frame.getSize().height)/2);
     frame.setVisible(true);

     erstelleMatrix();
     start=position(10,15);      // Hier wird der Startpunkt eingetragen !
     ziel=position(20,15);
     
    
     Quadrat pfad=berechnePfad(start,ziel);
      paint(frame.getGraphics());
     if(pfad==null)
     {
       System.out.println("Es gibt keinen Pfad");
     }else
       zeigePfad(pfad);
  }
  
  public void erstelleMatrix()
  {
     // erst mal ein leeres Array
     for(int i=0;i<size;i++)
      for(int o=0;o<size;o++)
        matrix[i+o*size]=0;
     // Die Hindernisse
     for(int i=0;i<22;i++)
       matrix[position(15,i)]=1;
     for(int i=0;i<22;i++)
       matrix[position(3+i,5)]=1;
     for(int i=0;i<22;i++)
       matrix[position(3+i,20)]=1;
  }
  
  
  public int position(int x, int y) {return x+y*size;}
  
  public int getX(int position)  {return position%size;}
  
  public int getY(int position) {return position/size;}
  
  public void paint(Graphics g)
  {
    g.setColor(Color.black);
    for(int i=0;i<size;i++)
     for(int o=0;o<size;o++)
     {
       if(matrix[i+o*size]==1)
       {
         g.fillRect(i*30,o*30,30,30);
       }
     }
    g.setColor(Color.red);
    g.fillRect(getX(start)*30,getY(start)*30,30,30);
    g.setColor(Color.green);
    g.fillRect(getX(ziel)*30,getY(ziel)*30,30,30);

    for(int i=0;i<offen.size();i++)  // zeige offene Liste
    {
       g.setColor(Color.blue);
       Quadrat q=((Quadrat)offen.elementAt(i));
       g.fillRect(getX(q.position)*30,getY(q.position)*30,30,30);
       g.setColor(Color.black);
       g.drawString("Q"+q.G,getX(q.position)*30,getY(q.position)*30+15);
       g.drawString("F"+q.F,getX(q.position)*30,getY(q.position)*30+30);
    }
    if(aktuell!=null)
    {
      g.setColor(Color.yellow);
      g.fillRect(getX(aktuell.position)*30,getY(aktuell.position)*30,30,30);
    }
  }
  
  public void zeigePfad(Quadrat aktuell)
  {
        int lauf=0;
        do
        {
           Graphics g=frame.getGraphics();
           g.setColor(Color.red);
           g.fillRect(getX(aktuell.position)*30,getY(aktuell.position)*30,30,30);
           g.drawString(""+lauf++,getX(aktuell.position)*30,getY(aktuell.position)*30);
           aktuell=aktuell.parent;

        }while(aktuell!=null);
  }

  public Quadrat berechnePfad(int start, int ziel)
  {
     offen.addElement(new Quadrat(start,null));
     do
     {
        if(!offen.isEmpty())
        {
          aktuell=(Quadrat)offen.firstElement();  // Suche in der offenen Liste nach dem Quadrat mit dem < F-Wert.
          verschiebe(aktuell);
          check(1,0,10);   // Quadrate rechts
          check(-1,0,10);
          check(0,1,10);
          check(0,-1,10);
          check(1,1,14);
          check(1,-1,14);
          check(-1,-1,14);
          check(-1,1,14);
        }
        else
          return null;
     }
     while(aktuell.position!=ziel);
     return aktuell;
  }
  
  public void verschiebe(Quadrat quadrat)      // Verschiebe Quadrat aus offener in geschlossene Liste
  {
    geschlossen.addElement(quadrat);
    offen.removeElement(quadrat);
  }
  
  public void check(int x, int y, int kosten)
  {
    int nummer=aktuell.position+x+y*size;
    int px=getX(aktuell.position),py=getY(aktuell.position);
    if((px+x)>0 && (px+x)<size && (py+y)>0 && (py+y)<size)
     if(matrix[nummer]==0)       // begehbar
      if(inListe(geschlossen,nummer)==null)  // noch nicht in geschlossener Liste
      {
        Quadrat temp=inListe(offen,nummer);
        if(temp==null)
        {
          Quadrat quadrat=new Quadrat(nummer,aktuell);
          quadrat.G=aktuell.G+kosten;
          quadrat.H=(Math.abs(getX(ziel)-getX(nummer))+Math.abs(getY(ziel)-getY(nummer)))*10;
          quadrat.F=quadrat.G+quadrat.H;
          // Quadrat sortiert in die offenen Liste eintragen
          einfuegen(quadrat);
        }else
        {
          if((aktuell.G+kosten)<temp.parent.G)
          {
            temp.parent=aktuell;
            temp.G=aktuell.G+kosten;
            temp.F=temp.G+temp.H;
          }
        }
      }
  }
  
  public boolean einfuegen(Quadrat quadrat)
  {
    if(offen.isEmpty())
    {
      offen.addElement(quadrat);
    }else
    {
      int i=0;
      do
      {
        if(((Quadrat)offen.elementAt(i)).F>=quadrat.F)
        {
          offen.insertElementAt(quadrat,i);
          return true;
        }
        i++;
      }while(i<offen.size());
      offen.addElement(quadrat);
    }
    return true;
  }
  
  public Quadrat inListe(Vector liste,int nummer)
  {
    if(liste.size()>0)
     for(int i=0;i<liste.size();i++)
       if(((Quadrat)liste.elementAt(i)).position==nummer)
         return (Quadrat)liste.elementAt(i);
    return null;
  }

  public class Quadrat
  {
    int position;
    Quadrat parent;
    int F=0,H,G=0;

    public Quadrat(int position,Quadrat parent)
    {
     this.position=position;
     this.parent=parent;
    }
  }
}

Das erste Problem ist ich krieg die Aplication nicht vernünftig beendet, weil ich nicht weiss wo die Threads gesetzt und beendet werden müssen.
Das zweite Problem ist, dass die Darstellung nicht richtig funktioniert: manchmal ja, manchmal halb, manchmal fast garnicht.
Ich hoffe ihr könnt mir weiterhelfen!
Danke schon mal im Voraus!

Mfg Deniz Engin a.k.a Halo_Player
 

André Uhres

Top Contributor
Code:
/*
 * A_Stern.java
 */
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;

public class A_Stern //implements KeyListener
{
    Vector offen=new Vector();
    Vector geschlossen=new Vector();
    Quadrat aktuell;
    
    JFrame frame=new JFrame();
    
    int size=32;
    int start,ziel;
    
    int[] matrix=new int[32*32];
    Quadrat pfad;
    public static void main(String[] args) {A_Stern start=new A_Stern();}
    
    public A_Stern() {
        frame.setSize(900,700);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);
        frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
        erstelleMatrix();
        start=position(10,15);      // Hier wird der Startpunkt eingetragen !
        ziel=position(20,15);
        pfad=berechnePfad(start,ziel);
        frame.add(new JScrollPane(new Graphik(this)));
        frame.setVisible(true);
    }
    
    public void erstelleMatrix() {
        // erst mal ein leeres Array
        for(int i=0;i<size;i++)
            for(int o=0;o<size;o++)
                matrix[i+o*size]=0;
        // Die Hindernisse
        for(int i=0;i<22;i++)
            matrix[position(15,i)]=1;
        for(int i=0;i<22;i++)
            matrix[position(3+i,5)]=1;
        for(int i=0;i<22;i++)
            matrix[position(3+i,20)]=1;
    }
    
    
    public int position(int x, int y) {return x+y*size;}
    
    public int getX(int position)  {return position%size;}
    
    public int getY(int position) {return position/size;}
    
    
    
    public Quadrat berechnePfad(int start, int ziel) {
        offen.addElement(new Quadrat(start,null));
        do
        {
            if(!offen.isEmpty()) {
                aktuell=(Quadrat)offen.firstElement();  // Suche in der offenen Liste nach dem Quadrat mit dem < F-Wert.
                verschiebe(aktuell);
                check(1,0,10);   // Quadrate rechts
                check(-1,0,10);
                check(0,1,10);
                check(0,-1,10);
                check(1,1,14);
                check(1,-1,14);
                check(-1,-1,14);
                check(-1,1,14);
            } else
                return null;
        }
        while(aktuell.position!=ziel);
        return aktuell;
    }
    
    public void verschiebe(Quadrat quadrat)      // Verschiebe Quadrat aus offener in geschlossene Liste
    {
        geschlossen.addElement(quadrat);
        offen.removeElement(quadrat);
    }
    
    public void check(int x, int y, int kosten) {
        int nummer=aktuell.position+x+y*size;
        int px=getX(aktuell.position),py=getY(aktuell.position);
        if((px+x)>0 && (px+x)<size && (py+y)>0 && (py+y)<size)
            if(matrix[nummer]==0)       // begehbar
                if(inListe(geschlossen,nummer)==null)  // noch nicht in geschlossener Liste
                {
            Quadrat temp=inListe(offen,nummer);
            if(temp==null) {
                Quadrat quadrat=new Quadrat(nummer,aktuell);
                quadrat.G=aktuell.G+kosten;
                quadrat.H=(Math.abs(getX(ziel)-getX(nummer))+Math.abs(getY(ziel)-getY(nummer)))*10;
                quadrat.F=quadrat.G+quadrat.H;
                // Quadrat sortiert in die offenen Liste eintragen
                einfuegen(quadrat);
            }else {
                if((aktuell.G+kosten)<temp.parent.G) {
                    temp.parent=aktuell;
                    temp.G=aktuell.G+kosten;
                    temp.F=temp.G+temp.H;
                }
            }
                }
    }
    
    public boolean einfuegen(Quadrat quadrat) {
        if(offen.isEmpty()) {
            offen.addElement(quadrat);
        }else {
            int i=0;
            do
            {
                if(((Quadrat)offen.elementAt(i)).F>=quadrat.F) {
                    offen.insertElementAt(quadrat,i);
                    return true;
                }
                i++;
            }while(i<offen.size());
            offen.addElement(quadrat);
        }
        return true;
    }
    
    public Quadrat inListe(Vector liste,int nummer) {
        if(liste.size()>0)
            for(int i=0;i<liste.size();i++)
                if(((Quadrat)liste.elementAt(i)).position==nummer)
                    return (Quadrat)liste.elementAt(i);
        return null;
    }
    
    public class Quadrat {
        int position;
        Quadrat parent;
        int F=0,H,G=0;
        
        public Quadrat(int position,Quadrat parent) {
            this.position=position;
            this.parent=parent;
        }
    }
    class Graphik extends JPanel{
        private A_Stern parentClass;
        public Graphik(A_Stern parent){
            parentClass = parent;
        }
        public Dimension getPreferredSize(){
            return new Dimension(960,960);
        }
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.setColor(Color.black);
            for(int i=0;i<size;i++){
                for(int o=0;o<size;o++) {
                    if(matrix[i+o*size]==1) {
                        g.fillRect(i*30,o*30,30,30);
                    }
                }
            }
            g.setColor(Color.red);
            g.fillRect(parentClass.getX(start)*30,parentClass.getY(start)*30,30,30);
            g.setColor(Color.green);
            g.fillRect(parentClass.getX(ziel)*30,parentClass.getY(ziel)*30,30,30);
            for(int i=0;i<offen.size();i++){  // zeige offene Liste
                g.setColor(Color.blue);
                Quadrat q=((Quadrat)offen.elementAt(i));
                g.fillRect(parentClass.getX(q.position)*30,parentClass.getY(q.position)*30,30,30);
                g.setColor(Color.black);
                g.drawString("Q"+q.G,parentClass.getX(q.position)*30,parentClass.getY(q.position)*30+15);
                g.drawString("F"+q.F,parentClass.getX(q.position)*30,parentClass.getY(q.position)*30+30);
            }
            if(aktuell!=null) {
                g.setColor(Color.yellow);
                g.fillRect(parentClass.getX(aktuell.position)*30,parentClass.getY(aktuell.position)*30,30,30);
            }
            if(parentClass.pfad==null) {
//                System.out.println("Es gibt keinen Pfad");
            }else
                zeigePfad(parentClass.pfad, g);
        }
    }
    public void zeigePfad(Quadrat aktuell, Graphics g) {
        int lauf=0;
        do{
            g.setColor(Color.red);
            g.fillRect(getX(aktuell.position)*30,getY(aktuell.position)*30,30,30);
            g.drawString(""+lauf++,getX(aktuell.position)*30,getY(aktuell.position)*30);
            aktuell=aktuell.parent;
         }while(aktuell!=null);
    }
}
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
Fiedelbambu Exception in Application constructor Java Basics - Anfänger-Themen 3
Johannes_ece Fehler: Application Terminated (TypeError): var$0.$moveToolTo is not a function Java Basics - Anfänger-Themen 4
B Best Practice Application-Config wie handhaben Java Basics - Anfänger-Themen 11
N Erste Schritte Karte in SWING Application Java Basics - Anfänger-Themen 4
B Linux - Error: Could not find or load main class application.Main Java Basics - Anfänger-Themen 28
S UserPref und Java Application klappt immer nicht. Java Basics - Anfänger-Themen 2
I Java, Application, Eclipse (Anfänger) Java Basics - Anfänger-Themen 1
J JavaFX aus Java-Application heraus starten Java Basics - Anfänger-Themen 7
L Erste Schritte Herangehensweise an Java-Application Java Basics - Anfänger-Themen 4
D JNLP - Unable to launch the application Java Basics - Anfänger-Themen 8
Y MenuBar in Application anzeigen Java Basics - Anfänger-Themen 7
P Application Server Java Basics - Anfänger-Themen 3
H archive vergleichbarer Paramter unter Tag Object mit Parameter codetype="application/java-vm" Java Basics - Anfänger-Themen 3
Spin Server Location is not an Sun Java System Application Server 8.2 Java Basics - Anfänger-Themen 2
D Entscheidungshilfe: Applet oder Application? Java Basics - Anfänger-Themen 6
G Applet in einer Application laden Java Basics - Anfänger-Themen 8
H Application kann nicht gestartet werden Java Basics - Anfänger-Themen 29
M einfache java application Java Basics - Anfänger-Themen 4
V Problem bei java Application Java Basics - Anfänger-Themen 3
G Java Applet und Java Application Java Basics - Anfänger-Themen 2
K Java Application mit Batch-datei starten Java Basics - Anfänger-Themen 9
J GUI Application Java Basics - Anfänger-Themen 4
G Funktion "Remote Java Application" in Eclipse Java Basics - Anfänger-Themen 2
F JFrame bei Start von Application öffnen Java Basics - Anfänger-Themen 15
D JDBC Treiber unter dem Java Application Server Java Basics - Anfänger-Themen 6
D Starten einer Class auf Java Application Server Java Basics - Anfänger-Themen 14
G Web-Application kompilieren Java Basics - Anfänger-Themen 3
H Rechteck ziehen bei einer Application Java Basics - Anfänger-Themen 2
A java application to exe-file, executable under windows Java Basics - Anfänger-Themen 2
H Wie Consolen Application mehrfach duchlaufen lassen? Java Basics - Anfänger-Themen 10
M Java Application Server - Webanwendungen Java Basics - Anfänger-Themen 13
G Highscoreliste mit Java erstellen [Application] Java Basics - Anfänger-Themen 6
K Java Sound Application Java Basics - Anfänger-Themen 2
D Java Application verpacken Java Basics - Anfänger-Themen 3
S Application starten / Applets + 3rd Person APIs Java Basics - Anfänger-Themen 10
J Inhalt einer Application speichern Java Basics - Anfänger-Themen 3
L Application als Dienst starten Java Basics - Anfänger-Themen 4
J Applet -> Application Java Basics - Anfänger-Themen 22
R applet -> application->thread Java Basics - Anfänger-Themen 5
M Application in Browser? Java Basics - Anfänger-Themen 3
J "vernünftig" programmieren lernen Java Basics - Anfänger-Themen 3
J Vernünftig Dateien byteweise lesen Java Basics - Anfänger-Themen 5
W Liste mit Listen in JTable darstellen Java Basics - Anfänger-Themen 1
X Wie kann man ein Regex erstellen, die 8-Bit-Binär-Zahlen darstellen. Java Basics - Anfänger-Themen 1
M Parse-Tree eines statements darstellen Java Basics - Anfänger-Themen 0
H Binominalkoeffizient tail-rekursiv in java darstellen Java Basics - Anfänger-Themen 0
S CSV Datei auslesen und anders darstellen Java Basics - Anfänger-Themen 2
F Hierarchi im code darstellen Java Basics - Anfänger-Themen 11
CptK Best Practice Merge-Sort als Baum darstellen Java Basics - Anfänger-Themen 3
E Kreis soll eine Raupe darstellen Java Basics - Anfänger-Themen 37
Orkanson Long Binär darstellen Java Basics - Anfänger-Themen 1
J Eingelesene Datei im Histrogramm darstellen Java Basics - Anfänger-Themen 3
pkm Best Practice BufferedImage in JPane darstellen - aber wie? Java Basics - Anfänger-Themen 22
D Klassen Wert aus JTextfield in JLabel (andere Klasse) darstellen. Java Basics - Anfänger-Themen 60
kilopack15 DoWhile-Schleife als While-Schleife darstellen Java Basics - Anfänger-Themen 9
X Minimax-Algorithmus über alle Kanten möglich? - Kanten darstellen Java Basics - Anfänger-Themen 1
E Input/Output Switch ausgabe anpassen bzw. anders darstellen Java Basics - Anfänger-Themen 13
L Mit java ein wort mehrfach versetzt darstellen Java Basics - Anfänger-Themen 14
H Wav-Datei grafisch darstellen Java Basics - Anfänger-Themen 2
3 Gitternetz richtig darstellen Java Basics - Anfänger-Themen 3
Messoras Sortieralgorithmus graphisch darstellen Java Basics - Anfänger-Themen 6
M Konkatenation in Sequenzdiagramm darstellen Java Basics - Anfänger-Themen 0
I Anzahl der Rechenschritte darstellen lassen Java Basics - Anfänger-Themen 11
Z Vector in jTextField/jLabel darstellen Java Basics - Anfänger-Themen 4
N Erste Schritte MySQL Tabelle in JList darstellen Java Basics - Anfänger-Themen 1
F Wurzelzeichen darstellen, Wie? Java Basics - Anfänger-Themen 7
V Intervall als Array darstellen Java Basics - Anfänger-Themen 10
A OOP Buchstaben mit ASCII Werten darstellen Java Basics - Anfänger-Themen 1
B Einfache jsp Seite darstellen Java Basics - Anfänger-Themen 9
P Erste Schritte Buffered Image splitten und darstellen Java Basics - Anfänger-Themen 2
U Exponent ausgeben bzw. darstellen Java Basics - Anfänger-Themen 15
H Wie kann ich in Java unbekannte Variablen in Gleichungen darstellen? Java Basics - Anfänger-Themen 3
J Zeichen für Durchmesser Ø in Label darstellen Java Basics - Anfänger-Themen 15
F Erste Schritte bild darstellen Java Basics - Anfänger-Themen 2
J Ein Grafisches Gitternetz (für Schiffe versenken) darstellen - Wie? Java Basics - Anfänger-Themen 6
P Zahlen als Unicode darstellen Java Basics - Anfänger-Themen 2
F Koordinaten JList darstellen Java Basics - Anfänger-Themen 4
A double and add algorithmus für elliptische kurven/ integer binär darstellen Java Basics - Anfänger-Themen 14
M Bild in Applet darstellen Java Basics - Anfänger-Themen 6
T Input/Output Scanner Eingaben auf Console farbig darstellen, wie? Java Basics - Anfänger-Themen 13
S String mit ASCII/HTML Zeichen darstellen Java Basics - Anfänger-Themen 10
D Graphics2D (Welle darstellen) Java Basics - Anfänger-Themen 2
D Problem: Deutschlandkarte darstellen ? Java Basics - Anfänger-Themen 12
Beckenbauer Eine anstehende (sehr simple) Applikation in UML darstellen (Klassendiagramm) Java Basics - Anfänger-Themen 20
D Kreissegment darstellen Java Basics - Anfänger-Themen 16
C Sortieralgorithmus grafisch darstellen Java Basics - Anfänger-Themen 3
alderwaran objekthierarchie darstellen während der laufzeit Java Basics - Anfänger-Themen 2
F FileSystem in Baum darstellen/wurzel festlegen Java Basics - Anfänger-Themen 3
E Auschnitt einer Liste darstellen Java Basics - Anfänger-Themen 7
I Baum graphisch darstellen Java Basics - Anfänger-Themen 2
A Klassen als GUI darstellen Java Basics - Anfänger-Themen 3
S Skatblatt darstellen durch Random? Java Basics - Anfänger-Themen 48
B OOP Comparator - Sortierung "optisch" Darstellen Java Basics - Anfänger-Themen 17
Forlan " <- Darstellen Java Basics - Anfänger-Themen 5
C Zwei Klassen in einem Fenster darstellen Java Basics - Anfänger-Themen 32
S RBTree - baumstruktur darstellen Java Basics - Anfänger-Themen 7
T Tupelweises Darstellen Java Basics - Anfänger-Themen 14
Z Java in HTML darstellen Java Basics - Anfänger-Themen 4
Y Einfachen Quelltext in UML darstellen mit Eclipse Java Basics - Anfänger-Themen 8
A Umlaute darstellen Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben