Confirmation Dialog erstellen

melaniemueller

Aktives Mitglied
Ich stehe bei einer vermeintlich simplen Aufgabe total auf dem Schlauch und bräuchte ein wenig Starthilfe von euch 😅 🤔

Hier einmal die Aufgabenstellung:

Erstellen Sie einen universellen Dialog für JavaFX, in dem der Anwender eine beliebige Frage mit Ja oder Nein beantworten kann. Leiten Sie dazu eine eigene Klasse von der Klasse Alert ab. Die Texte im Dialog sollen über Argumente festgelegt werden.

Stellen Sie sicher, dass Sie die Antwort des Anwenders in Ihrem Code auswerten können. Der Dialog muss also einen Rückgabewert zur Verfügung stellen. Wie Sie dabei vorgehen, ist Ihnen freigestellt.

Ob Sie für die Lösung den neuen Dialog in den Editor aus diesem Studienheft einbauen oder eine eigene Anwendung erstellen, die nur den Dialog anzeigt und die Rückgabe auswertet, ist Ihnen freigestellt.

Einige Hinweise zur Lösung:

Einen Standarddialog für eine Bestätigung erhalten Sie mit dem Typ AlertType.CONFIRMATION.

Den Text in der Titelleiste des Dialogs können Sie über die Methode setTitle() festlegen.

Die Schaltflächen im Dialog können Sie über den Konstruktor festlegen. Dazu übergeben Sie Argumente vom Typ ButtonType. Der Wert ButtonType.YES steht zum Beispiel für eine Schaltfläche mit dem Text „Ja“ und der Wert ButtonType.NO für eine Schaltfläche mit dem Text „Nein“.

Die angeklickte Schaltfläche erhalten Sie über die Methode getResult(). Sie liefert einen Wert vom Typ ButtonType zurück.


Nun ging ich eigentlich davon aus, ich würde das direkt hinbekommen, aber das mit der eigenen Klasse und von Alert ableiten und was dabei raus kommt verwirrt mich dann doch. Ich habe nun eine Klasse erstellt. Diese leite ich wie gewünscht von Alert ab, dann bringt er mir 2 Möglichkeiten für den Konstruktor. Ich wähle den mit 3 Argumenten, da es ja heißt die Inhalte sollen über Argumente erfolgen. Nun weiß ich aber nicht wirklich weiter. Ohne diese Posten hätte ich den Dialog einfach so erstellt:
Java:
 Alert meinDialog = new Alert(AlertType.CONFIRMATION, "Hier würde eine Frage stehen", ButtonType.YES, ButtonType.NO);

Aktuell steht noch nichts dort außer:

Java:
package de.fernschulen;

import javafx.scene.control.Alert;
import javafx.scene.control.ButtonType;

public class DialogKlasse extends Alert {

    public DialogKlasse(AlertType arg0, String arg1, ButtonType[] arg2) {
        super(arg0, arg1, arg2);
}

        

    }
 
Ohne diese Posten hätte ich den Dialog einfach so erstellt:
Java:
Alert meinDialog = new Alert(AlertType.CONFIRMATION, "Hier würde eine Frage stehen", ButtonType.YES, ButtonType.NO);
Und was hindert Dich daran, im Konstruktor
Java:
super(AlertType.CONFIRMATION, "Hier würde eine Frage stehen", ButtonType.YES, ButtonType.NO);
aufzurufen?
 
Zu meiner Schande muss ich sagen, dass ich heute endlich mal weiter gemacht habe bei dieser Aufgabe, aber einfach unfassbar frustriert bin. Das Thema JavaFX ist mir echt noch ein Dorn im Auge. Hab sogar das Studienheft nochmal durchgelesen...aber naja. Somit zeige ich euch mal mein aktuelles absolut fehlerhaftes Ergebnis und hoffe ihr habt noch weitere Anstupser für mich damit ich das ganze irgendwann mal noch fertig bekomme 😒

Also nun, ich zeig einfach mal her was da bisher steht:

Java:
package universellerDialogJavaFX;

import javafx.event.ActionEvent;
import javafx.scene.control.Alert;
import javafx.scene.control.ButtonType;

public class UniversellerDialog extends Alert {

    public UniversellerDialog(AlertType alertType, String DialogText, String titel, ButtonType buttonType1, ButtonType buttonType2) {
        super(alertType);
        super.setTitle(titel);
        super.setContentText(DialogText);
        super.getButtonTypes().setAll();
        super.showAndWait();
        
    }
    
    public void buttonReaktion(ActionEvent event) {
        if (super.getResult() == ButtonType.YES)
            super.setContentText("Dann hast du alles richtig gemacht - weiter so");
        else
            super.setContentText("Dann solltest du heute bewussst etwas tun, was dich glücklich macht!");
    }
    
}

Und in der Main wollte ich dann die passenden Argumente übergeben, aber beim Ausführen kommt dann nur eine große Scharr an Fehlern...
Java:
package universellerDialogJavaFX;

import javafx.scene.control.Alert.AlertType;
import javafx.scene.control.ButtonType;

public class DialogMain {

    public static void main(String[] args) {
        new UniversellerDialog(AlertType.CONFIRMATION,"Eine kurze Frage: Bist du heute glücklich?", "Wichtige Frage", ButtonType.YES, ButtonType.NO);

    }

}

Fehler:
Java:
Exception in thread "main" java.lang.ExceptionInInitializerError
    at javafx.scene.control.DialogPane.createContentLabel(DialogPane.java:167)
    at javafx.scene.control.DialogPane.<init>(DialogPane.java:218)
    at javafx.scene.control.Dialog.<init>(Dialog.java:512)
    at javafx.scene.control.Alert.<init>(Alert.java:247)
    at javafx.scene.control.Alert.<init>(Alert.java:222)
    at universellerDialogJavaFX.UniversellerDialog.<init>(UniversellerDialog.java:10)
    at universellerDialogJavaFX.DialogMain.main(DialogMain.java:9)
Caused by: java.lang.IllegalStateException: Toolkit not initialized
    at com.sun.javafx.application.PlatformImpl.runLater(PlatformImpl.java:410)
    at com.sun.javafx.application.PlatformImpl.runLater(PlatformImpl.java:405)
    at com.sun.javafx.application.PlatformImpl.setPlatformUserAgentStylesheet(PlatformImpl.java:695)
    at com.sun.javafx.application.PlatformImpl.setDefaultPlatformUserAgentStylesheet(PlatformImpl.java:657)
    at javafx.scene.control.Control.<clinit>(Control.java:99)
    ... 7 more


Keine Ahnung warum das so zäh läuft...ich will doch nur einen einzigen Dialog anzeigen...ich hoffe mal es ist nicht komplett falsch woran ich da den heutigen Abend bisher saß, aber wohlmöglich doch 😞
 
Also Das was du hier machst hat nicht viel mit einen javafx Projekt zu tun.
Wenn du javafx willst
erstens hast du keinen launch Aufruf in der Main und wo ist die Start Methode.
 
Das Problem ist, dass du JavaFX Elemente nur nutzen kannst, wenn das Framework (Toolkit) sozusagen gestartet ist.

Das kann man auch manuell starten - dazu kann man z.B. mal suchen, wie JavaFX Elemente in swing genutzt werden können (da wird das erst initialisiert).

Unter dem Strich läuft es vermutlich auf ein Platform.startup hinaus. Aber lies mal auf Google.
 
Also Das was du hier machst hat nicht viel mit einen javafx Projekt zu tun.
Wenn du javafx willst
erstens hast du keinen launch Aufruf in der Main und wo ist die Start Methode.
Oky bedeutet sobald JavaFX brauch ich IMMER die Start Methode und launch Aufruf. Das hatte ich auch schon mal abgeändert und dann wieder weg. Mich verwirrt einfach die Tatsache, dass ich die ganzen Aufgaben zuvor mit Controller und FXML gearbeitet habe und dachte das gehöre eben zu JavaFX dazu und ist fester Bestandteil. Bei dieser Aufgabe zeigt es mir aber, dass man es eben nicht braucht wie eben wenn man nur einen Dialog möchte und ansonsten keinerlei Oberfläche. Daher war ich mir auch nicht sicher, was dann zwingend für JavaFX nötig ist und was nicht . Ich werd jetzt mal Start und launch ergänzen...
 
Wie sieht denn dann die Start Methode aus? Normalerweise beschaffe ich dort ja die FXML und verbinde mit dem Controller usw. Aber eben diese Dinge habe ich nicht. Oder brauch ich die nun doch zwingend? 😖
 
Neun, die brauchst du nicht zwingend. Aber du kannst deinen Code z.B. in eine Platform.start platzieren, wenn es um JavaFX Dialoge geht.

Ab JavaFX 11 (oder so) gibt es in Plattform die startup Methode. Diese nimmt ein Runnable.

Also vermutlich kann es schon ok sein, etwas zu haben wie:
Java:
public void whatever() {
  // irgendwas, dass auch JavaFX braucht
}

  ...
  Platform startup(this::whatever());
  ...
 
Wenn du ein JavaFX Programm entwickeln willst, dann mach es nach Schema F: Von Application ableiten und launch Methode aufrufen.

Wenn es keine fx Anwendung sein soll und du dann nur mal FX Dialoge nutzen willst: siehe Antwort vor dieser...
 
Wenn du ein JavaFX Programm entwickeln willst, dann mach es nach Schema F: Von Application ableiten und launch Methode aufrufen.

Wenn es keine fx Anwendung sein soll und du dann nur mal FX Dialoge nutzen willst: siehe Antwort vor dieser...
Ok, wenn ich dann nun dieses Grundgerüst habe:
Java:
package universellerDialogJavaFX;

import javafx.application.Application;
import javafx.stage.Stage;

public class DialogMain extends Application {
    
    
@Override
    public void start(Stage arg0) throws Exception {
        
    }
    public static void main(String[] args) {

        launch(args);
    }


}
Wo könnte ich dann meine Argumente übergeben an den Konstruktor meiner Dialog Klasse?
 
In der Regel würdest du in start die Stage füllen und sichtbar machen. Du kannst da aber prinzipiell auch alles andere machen.

Du kannst auch die main dazu nutzen, andere Dinge anzufangen. Aber dann wäre wichtig, dass UI Dinge im UI Thread erfolgen müssen => Platform.runLater
 
aber du willst mit deinem bestätigungs code doch in deiner app bleiben, vom confirmation dialog via args es weiter zu geben an eine neue app macht wenig sinn
 

Zurück
Oben