C++ Umsteiger: SplashScreen API Java SE 6

Status
Nicht offen für weitere Antworten.

geneticZ

Bekanntes Mitglied
Hallo allerseits,
wie in der Überschrift erwähnt bin ich C++ Umsteiger und habe hier und da ein paar kleine Verständnis Probleme. :(

Kurz zur Erklärung, ich muss für ein Projekt zu Beginn meines Programms einen Filesearch ausführen...
Diesen habe ich erst in C++ mit WinApi, dann weil es später Betriebssystem unabhängig sein musste in C++ mit Boost-Libs und jetzt letzten Endes in Java programmiert.

Nun hätte ich gerne einen SplashScreen wärend der Dateisuche eingeblendet, da wenn die Datei blöd liegt die Suche doch etwas dauern kann.

Mit dem Tutorial: "How to Create a SplashScreen" wurde mir glücklicherweise etwas Licht ins Dunkle gebracht, aber mir fehlen eben hier und da noch ein paar Java Basics um komplett durchzusteigen. :roll:

Ich poste hier jetzt mal den Demo Code von der Seite zerstückelt und schreibe dazu was ich begreife und was nicht.
Bitte korrigiert mich wenn irgendwas nicht stimmt bzw klärt mich auf wenn ich was nich richtig checke! :)


Code:
import java.awt.*;
import java.awt.event.*;

public class SplashDemo extends Frame implements ActionListener {
    static void renderSplashFrame(Graphics2D g, int frame) {
        final String[] comps = {"foo", "bar", "baz"};
        g.setComposite(AlphaComposite.Clear);
        g.fillRect(120,140,200,40);
        g.setPaintMode();
        g.setColor(Color.BLACK);
        g.drawString("Loading "+comps[(frame/5)%3]+"...", 120, 150);
    }
Hier wird auf dem bestehenden Bild eine neue Grafik gezeichnet, ohne das eigentlich Bild zu verändern.
Allerdings erst weiter unten mit update() sichtbar gemacht.
Code:
    public SplashDemo() {
        super("SplashScreen demo");
        setSize(300, 200);
        setLayout(new BorderLayout());
        Menu m1 = new Menu("File");
        MenuItem mi1 = new MenuItem("Exit");
        m1.add(mi1);
        mi1.addActionListener(this);
        this.addWindowListener(closeWindow);

        MenuBar mb = new MenuBar();
        setMenuBar(mb);
        mb.add(m1);
Was genau macht dieses super("...")? Das kapier ich leider nicht :cry:
Dann wird Größe, Border, Menu etc Eigentschaften für das Window gesetzt...
Dazu noch ein ActionListener der das Window schließt wenn ein neues Fenster (bzw die richtige Anwendung) aufgeht??

Code:
        final SplashScreen splash = SplashScreen.getSplashScreen();
        if (splash == null) {
            System.out.println("SplashScreen.getSplashScreen() returned null");
            return;
        }
Hier wird der SplashScreen dann geholt und angezeigt...
Leider bekomme ich hier wenn ich compile nur "return null", zum Kompilieren muss ich später aber noch weitere Fragen stellen.
Code:
        Graphics2D g = splash.createGraphics();
        if (g == null) {
            System.out.println("g is null");
            return;
        }
Was das hier macht versteh ich leider gerade Überhaupt nicht :(

Code:
        for(int i=0; i<100; i++) {
            renderSplashFrame(g, i);
            splash.update();
            try {
                Thread.sleep(90);
            }
            catch(InterruptedException e) {
            }
        }
        splash.close();
        setVisible(true);
        toFront();
    }
Hier wird das oben genannte Update ausgeführt, müsste der Ladebalken sein...
Sleep, close , toFront etc müssten mir klar sein.
Code:
    public void actionPerformed(ActionEvent ae) {
        System.exit(0);
    }
Was passiert hier? Oder wird hier der Splashscreen geschlossen wenn die Hauptanwendung aufgeht?

Code:
    private static WindowListener closeWindow = new WindowAdapter(){
        public void windowClosing(WindowEvent e){
            e.getWindow().dispose();
        }
    };
    
    public static void main (String args[]) {
        SplashDemo test = new SplashDemo();
    }
}
Das hier is mir relativ klar alles, das übliche Fenster wird erstellt...

Wie sollte ich das jetzt kompilieren? Ich bin den Anweisung mit der commandline mal gefolgt, hab da aber nur Fehlermeldungen bekommen.
Weiterhin weiss ich nicht genau wie ich den Splashscreen mit meiner bereits erstellten Filesuche verknüpfen soll!
Da wäre ich über Hilfe auch sehr Dankbar!

Allgemein schonmal Danke an jeden der sich diesen langen Text angetan hat! :oops:
mfg
geneticZ
 

moormaster

Top Contributor
geneticZ hat gesagt.:
Was genau macht dieses super("...")? Das kapier ich leider nicht :cry:

Mit super rufst du den Konstruktor der Oberklasse auf. In C++ stand sowas sonst in der Kopfzeile des neuen Konstruktors hinter nem Doppelpunkt, wenn ich das richtig in Erinnerung hab...


Dazu noch ein ActionListener der das Window schließt wenn ein neues Fenster (bzw die richtige Anwendung) aufgeht??

addActionListener(this); bedeutet, dass die aktuelle Objektreferenz als ActionListener verwendet wird. D.h. sie die Klasse des aktuellen Objekts muss das Interface ActionListener implementieren und somit eine Methode actionPerformed(...) definieren. Diese wird dann aufgerufen, wenn das entsprechende Ereignis Eintritt. Im Fall von MenuItem wird es sich dabei um das Ereignis handeln, wenn das MenuItem ausgewählt wird (z.B. per Klick)

Code:
        final SplashScreen splash = SplashScreen.getSplashScreen();
        if (splash == null) {
            System.out.println("SplashScreen.getSplashScreen() returned null");
            return;
        }

Hier wird der SplashScreen dann geholt und angezeigt...
Leider bekomme ich hier wenn ich compile nur "return null", zum Kompilieren muss ich später aber noch weitere Fragen stellen.

Was heisst wenn du compilierst? Kommt dieser Meldung beim Compilieren oder beim Ausführen? In der Java-API steht, dass es diese Klasse erst ab Java Version 1.6 gibt... hast du vielleicht ein älteres JDK als 1.6 installiert?

Code:
        Graphics2D g = splash.createGraphics();
        if (g == null) {
            System.out.println("g is null");
            return;
        }
Was das hier macht versteh ich leider gerade Überhaupt nicht :(

Damit holt er sich eine Instanz von Graphics2D. Dieses Objekt ermöglicht es dann, in die Zeichenfläche des splash-Frames zu zeichnen.

Code:
    public void actionPerformed(ActionEvent ae) {
        System.exit(0);
    }
Was passiert hier? Oder wird hier der Splashscreen geschlossen wenn die Hauptanwendung aufgeht?

Das ist die angesprochene Methode des ActionListeners, welche aufgerufen wird, wenn das MenuItem mi1 (Exit) angeklickt wird. Die Splash-Klasse ist quasi ein ActionListener, welcher sich selbst bei mi1 als solcher registriert hat.

Code:
    private static WindowListener closeWindow = new WindowAdapter(){
        public void windowClosing(WindowEvent e){
            e.getWindow().dispose();
        }
    };
    
    public static void main (String args[]) {
        SplashDemo test = new SplashDemo();
    }
}
Das hier is mir relativ klar alles, das übliche Fenster wird erstellt...

Wenn man in Java eine Klasse ein Interface implementiert, dann müssen alle Methoden des Interfaces überschrieben werden. ActionListener und WindowListener sind solche Interfaces. Manchmal möchte man aber nur wenige Methoden überschreiben. Deshalb gibt es auch eine Klasse WindowAdapter, welche bereits alle Methoden des WindowListeners implementiert. Von dieser Klasse kann man dann erben und nur diejenigen Methoden überschreiben, die man für die Ereignisbehandlung wirklich braucht. Dies geschieht hier auch mit Hilfe einer anonymen Klasse:

Code:
    // WindowAdapter implementiert das Interface WindowListener und deshalb
    // kann die Referenz darauf auch in einer Variable vom Typ WindowListener gespeichert werden... simples OOP :D
    private static WindowListener closeWindow = new WindowAdapter(){
        // es wird ein WindowAdapter angelegt und gleichzeitig eine Methode von ihm überschrieben
        public void windowClosing(WindowEvent e){

            // diese Zeile schliesst das Fenster permament... nach dispose() kann dieses Frame-Objekt nicht mehr wieder eingeblendet werden
            e.getWindow().dispose();
        }
    };


Wie sollte ich das jetzt kompilieren? Ich bin den Anweisung mit der commandline mal gefolgt, hab da aber nur Fehlermeldungen bekommen.

Es wäre gut, wenn du uns auch sagst, welche Fehlermeldungen du bekommen hast.

Weiterhin weiss ich nicht genau wie ich den Splashscreen mit meiner bereits erstellten Filesuche verknüpfen soll!
Da wäre ich über Hilfe auch sehr Dankbar!

Wenn du das mit dem Compilieren hinbekommen hast, beschränkt sich die Benutzung der Splash-Klasse auf diese Zeilen:

Code:
public static void main (String args[]) {
        SplashDemo test = new SplashDemo();
    }
 

geneticZ

Bekanntes Mitglied
Hallo moormaster,
erstmal vielen vielen Dank dass du dir die Mühe gemacht hast! :toll:

Natürlich hast du mir hiermit erheblich zu Verständnis verholfen!
Ich bin mitlerweile auch soweit, dass ich das Skript zum laufen gebracht habe. Ein paar kleine Probleme habe ich dennoch:

- wenn super("...") den Konstruktor der Oberklasse aufruft, heißt das ja dass die private Variable aus der Klasse ein String ist? Bin da gerade etwas verwirrt ???:L

- Viel wichtiger ist mir jedoch, dass ich momentan einfach nicht wirklich weiß wo ich meinen Filesearch unterbringen kann bzw mit dem Splashscreen verknüpfen könnte.

Derzeit habe ich ein jar-file erstellt mit Manifestdatei. Nun wird der Splashscreen für eine Sekunde angezeigt, verschwindet gleich wieder und der Filesearch beginnt.
Ist ja klar, weil noch nichts verknüpft ist... aber wie bekomme ich das hin? :roll:

Danke im Voraus
geneticZ
 

moormaster

Top Contributor
geneticZ hat gesagt.:
- wenn super("...") den Konstruktor der Oberklasse aufruft, heißt das ja dass die private Variable aus der Klasse ein String ist? Bin da gerade etwas verwirrt ???:L

Nein das heisst erstmal nur, dass in der Oberklasse java.awt.Frame ein Konstruktor dieser Form aufgerufen wird:

Code:
public class Frame
{
  // Konstruktor
  public Frame(String irgendeinParameter)
  {
    // Konstrukor-Rumpf
  }

  // weitere Konstruktoren
  public Frame(...)
  {
    // ...
  }

  // ...
}

Was der Konstruktor mit dem String dann macht, kannst du von aussen nicht sehen... ob er es in einer Membervariable speichert oder den String völlig ignoriert, ist dem Konstruktor überlassen.

- Viel wichtiger ist mir jedoch, dass ich momentan einfach nicht wirklich weiß wo ich meinen Filesearch unterbringen kann bzw mit dem Splashscreen verknüpfen könnte.

Derzeit habe ich ein jar-file erstellt mit Manifestdatei. Nun wird der Splashscreen für eine Sekunde angezeigt, verschwindet gleich wieder und der Filesearch beginnt.
Ist ja klar, weil noch nichts verknüpft ist... aber wie bekomme ich das hin? :roll:

Du könntest dir die SplashDemo.java Datei anschauen... an dieser Stelle:

Code:
 for(int i=0; i<100; i++) {
  renderSplashFrame(g, i);
  splash.update();

  try {
   Thread.sleep(90);
  }
  catch(InterruptedException e) {
  }
 }

muss statt der Schleife dein File-Such-Aufruf hin... Du könntest deiner FileSearch-Klasse die beiden Referenzen g und splash übergeben und dann kann deine FileSearch-Klasse regelmäßig diese beiden Zeilen ausführen:

Code:
 renderSplashFrame(g, i);
 splash.update();

und anstelle von i irgendeinen Wert von 0 bis 99 zurückgeben... Allerdings stelle ich mir das kompliziert vor, bei einem rekursiven File-Such-Algorithmus in Prozent anzugeben, wieviel man schon durchsucht hat, da man den Inhalt der Unterverzeichnisse ja erst nach und nach kennenlernt und nie wirklich weiss, wieviele Dateien noch auf einen zu kommen... evtl. wäre es dann zweckmäßig, die SplashDemo zu modifizieren, so dass nicht ein Statusbalken geupdated wird, sondern dass du der renderSplashFrame-Methode einfach den Pfad übergibst, wo dein Programm gerade sucht... der Nutzer kennt seine Festplatte am besten und weiss dann ungefähr, was alles noch kommen wird :D


Alternativ kannst du ja auch versuchen, einen Callback zu bauen, der dann so wie die Listener funktioniert. D.h. du speicherst in deiner FileSearch-Klasse eine Referenz zu einem Callbackobjekt und gibst dann Statusinformationen nach aussen, in dem du eine bestimmte Methode dieses Callbacks aufrufst mit den Statusinfos als Parameter (z.B. eben der aktuelle Pfad, wo gerade gesucht wird):

Code:
public interface FileSearchCallback
{
  statusUpdated(String Path);
}

public class FileSearch
{
  FileSearchCallback callback;

  public FileSearch()
  {
    // ...
  }

  public void setCallback(FileSearchCallback callback)
  {
    this.callback = callback;
  }

  // diese Methode braucht man wahrscheinlich nie...
  // die mach ich immer aus Gewohnheit mit rein :D
  public FileSearchCallback getCallback()
  {
    return this.callback;
  }

  // dein FileSearch-Algorithmus
  public void doFileSearch(String path)
  {
    if (callback != null)
     callback.statusUpdated(path);

    // rekursive Suche ...
  }
}

In diesem Fall würdest du also ein Objekt vom Typ FileSearchCallback bauen, welches dann in der statusUpdated() Methode das Neuzeichnen des Splash-Screens übernimmt.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
Thallius Best Practice Umsteiger braucht Tipps zur Bildverarbeitung Java Basics - Anfänger-Themen 1
W Erste Schritte OOP-Lektüre für Anfänger/Umsteiger von Clipper auf Java Java Basics - Anfänger-Themen 6
S OOP Verständnisproblem Umsteiger Java Basics - Anfänger-Themen 22
C Umsteiger hat noch ein paar Fragen Java Basics - Anfänger-Themen 11
B Umsteiger versucht sich bei MIDI in Java Java Basics - Anfänger-Themen 7
F Datentypen PHP-Umsteiger vermisst foreach-Schleife Java Basics - Anfänger-Themen 4
L Applet SplashScreen Java Basics - Anfänger-Themen 13
F Problem mit SplashScreen Java Basics - Anfänger-Themen 6
F StartUp bzw. Splashscreen? Java Basics - Anfänger-Themen 5
G Text in Splashscreen Java Basics - Anfänger-Themen 5
W Java-PRogramm liest als EXE-File Nicht USB, jedoch aus NetBeans Java Basics - Anfänger-Themen 23
W Methoden java map ersatz für c++map Java Basics - Anfänger-Themen 2
M Erste Schritte Java Primzahltester Java Basics - Anfänger-Themen 4
A csv Reader für Java? Java Basics - Anfänger-Themen 27
K Java - Enums Java Basics - Anfänger-Themen 30
tomzen Java Unterstützung für exel dateien installieren. Java Basics - Anfänger-Themen 2
Rookar java.lang.NoClassDefFoundError: org/json/JSONException Java Basics - Anfänger-Themen 2
Rookar Mit Button andere java öffnen Java Basics - Anfänger-Themen 4
F Java Object to Hashmap ? Java Basics - Anfänger-Themen 6
I Backend in Java und Ansicht von Dateien in statische HTML Seiten? Java Basics - Anfänger-Themen 15
R Input/Output Verwendung des Euro-Zeichens in Java Java Basics - Anfänger-Themen 7
I Push Nachrichten von JAVA EE App an Mobile App Java Basics - Anfänger-Themen 3
H .java Dateien in Eclipse einbinden und ausführen Java Basics - Anfänger-Themen 1
onlyxlia Schlüsselworte Was meint man mit "einen Typ" in Java erstellen? Java Basics - Anfänger-Themen 2
O Java Kara geschweifte Klammern Java Basics - Anfänger-Themen 2
richis-fragen Mausrad logitech kann links und rechts klick wie in java abragen. Java Basics - Anfänger-Themen 15
XWing Java Klssenproblem Java Basics - Anfänger-Themen 4
R Umgebungsvariable java -cp gibt immer Java-Hilfe... Java Basics - Anfänger-Themen 3
farbenlos Csv Datei in Java einlesen Java Basics - Anfänger-Themen 18
F TableModelListener: java.lang.ArrayIndexOutOfBoundsException: 132 Java Basics - Anfänger-Themen 3
G Java 8 - Support-Ende Java Basics - Anfänger-Themen 7
T Java Weihnachtsbaum + Rahmen Java Basics - Anfänger-Themen 1
N Will mit Java anfangen Java Basics - Anfänger-Themen 13
Ü Java Array - Buchstaben als Zahlen ausgeben Java Basics - Anfänger-Themen 22
M Java Iterator Verständnisfrage Java Basics - Anfänger-Themen 6
M Java Mail Programm Java Basics - Anfänger-Themen 4
Sniper1000 Java 391 für Windows Java Basics - Anfänger-Themen 37
J Java long- in int-Variable umwandeln Java Basics - Anfänger-Themen 6
JaZuDemNo Java im Studium Java Basics - Anfänger-Themen 7
E Java Programm zur anzeige, ob Winter- oder Sommerzeit herrscht Java Basics - Anfänger-Themen 62
I QR code in Java selber generieren Java Basics - Anfänger-Themen 5
V Java-Ausnahmebehandlung: Behandlung geprüfter Ausnahmen Java Basics - Anfänger-Themen 1
krgewb Java Streams Java Basics - Anfänger-Themen 10
A Überwältigt von der komplexen Java Welt Java Basics - Anfänger-Themen 29
O Mehrfachvererbung auf Spezifikations- und Implementierungsebene in Java. Interfaces Java Basics - Anfänger-Themen 19
John_Sace Homogene Realisierung von Generics in Java ? Java Basics - Anfänger-Themen 19
P Meldung aus Java-Klasse in Thread an aufrufende Klasse Java Basics - Anfänger-Themen 1
R mit Java API arbeiten Java Basics - Anfänger-Themen 9
P JDK installieren Probleme bei der Java-Installation Java Basics - Anfänger-Themen 8
S Java: Wie sortiere ich eine ArrayList benutzerdefinierter Objekte nach einem bestimmten Attribut? Java Basics - Anfänger-Themen 2
Timo12345 JNLP File mit Java öffnen Java Basics - Anfänger-Themen 2
S Video Editierung mit Java.._ Java Basics - Anfänger-Themen 2
F Einstelungen in Java - CursorBlinkRate Java Basics - Anfänger-Themen 10
A PHP $_POST["name"] in Java Java Basics - Anfänger-Themen 3
vivansai21 Is there a oneliner to create a SortedSet filled with one or multiple elements in Java? Java Basics - Anfänger-Themen 9
Athro-Hiro Weißes Bild in Java erstellen Java Basics - Anfänger-Themen 3
Arjunreddy Can someone please tell me how to use a debugger in BlueJ(a Java environment) Java Basics - Anfänger-Themen 1
M Java assoziationen (UML) Java Basics - Anfänger-Themen 8
H Excel-Tabellen mit Java erstellen Java Basics - Anfänger-Themen 4
Simon16 Java ArrayListe von einer Klasse sortieren Java Basics - Anfänger-Themen 2
P Wie kann ich in meinem Java Programm etwas dauerhaft speichern? Java Basics - Anfänger-Themen 5
H Nutzt Eclipse alle CPU-Threads beim Ausführen von Java-Programmen? Java Basics - Anfänger-Themen 4
xXGrowGuruXx Java einstieg, leichte sache 0 verstanden Java Basics - Anfänger-Themen 7
A java.sql.SQLException: Data type mismatch. Java Basics - Anfänger-Themen 1
H Java-Programm zur Ausgabe von Zuständen Java Basics - Anfänger-Themen 80
N Java Spiel Figur auf dem Hintergrundbild bewegen. Java Basics - Anfänger-Themen 11
G Kann Java-Programm nicht als jar aufrufen, auch als EXE nicht Java Basics - Anfänger-Themen 19
N Java Taschenrechner hat Jemand vlt einen Tipp dafür wie ich jetzt die buttons verbinden kann und das Ergebnis auf dem textfield anzeigen lassen kann Java Basics - Anfänger-Themen 13
A Lerngruppe Java Java Basics - Anfänger-Themen 2
G Help me in the Java Program Java Basics - Anfänger-Themen 2
L Java- Vererbung Java Basics - Anfänger-Themen 4
LimDul Suche Java Stream Tutorial Java Basics - Anfänger-Themen 2
_so_far_away_ Ich möchte Java lernen Java Basics - Anfänger-Themen 11
benny1993 Java Programm erstellen für ein Fußball-Turnier Java Basics - Anfänger-Themen 3
M Datentypen While-Schleife eine Java Methode erstellen Java Basics - Anfänger-Themen 3
V Bild per Java Script austauschen Java Basics - Anfänger-Themen 7
MoxMorris this Keyword in Java Java Basics - Anfänger-Themen 14
D Wie kann man in Java nach Arrays auf Duplikate prüfen Java Basics - Anfänger-Themen 12
wolei JAVA Zeitdifferenz feststellen. Java Basics - Anfänger-Themen 4
DiyarcanZeren Rekursion in Java Java Basics - Anfänger-Themen 5
wolei Java generic interface in a generic class Java Basics - Anfänger-Themen 6
monsterherz Ablauf der Erstellung eines Java Programmes Java Basics - Anfänger-Themen 17
monsterherz Circle.java:5: error: <identifier> expected Java Basics - Anfänger-Themen 2
julian-fr Wie kann ich am besten Java lernen? Java Basics - Anfänger-Themen 17
A Java-Properties und -RessourceBundles Java Basics - Anfänger-Themen 5
lrnz22 Java-Basics-Aufgabe Java Basics - Anfänger-Themen 8
R Java kann nicht installiert werden Java Basics - Anfänger-Themen 8
marcelnedza Finde meinen Fehler in einer Methode nicht, Java Karol Java Basics - Anfänger-Themen 15
G In ein java Dokument Ton einbinden Java Basics - Anfänger-Themen 1
C was heisst es wenn java ']' erwartet ? Java Basics - Anfänger-Themen 2
KeinJavaFreak Erste Schritte Programm "Java(TM) Platform SE binary " nicht vorhanden Java Basics - Anfänger-Themen 1
KeinJavaFreak Erste Schritte Java "Executable Jar File" nicht vorhanden Java Basics - Anfänger-Themen 1
melisax Java 2D-Array Tabelle Java Basics - Anfänger-Themen 4
melisax Java Array Wert an bestimmtem Index angeben Java Basics - Anfänger-Themen 14
J Java Testklasse Java Basics - Anfänger-Themen 5
P Java Selenium . Parameterized.Parameters erzeugt eine Fehlermeldung Java Basics - Anfänger-Themen 14
W Java-Code mit Array Java Basics - Anfänger-Themen 14
W Java-Code Java Basics - Anfänger-Themen 2
P BeforeEach AfterEach werden nicht ausgeführt. Java / Selenium Java Basics - Anfänger-Themen 4
A Wie führe ich eine Batch-Datei von meiner Java-Anwendung aus? Java Basics - Anfänger-Themen 18

Ähnliche Java Themen

Neue Themen


Oben