Modal Window

Isa_Hope

Mitglied
Hallo!
Ich habe ein Hauptfenster mit Buttons und eine zweite Klasse für ein weiteres Fenster. Das Hauptfenster ist eine Unterklasse von Application und das zweite Fenster eine Unterklasse von Stage. Wenn ich durch den Button die zweite Klasse öffne, ist das erste Fenster verschwunden. Meine Aufgabe ist es aber, dass das Hauptfenster geöffnet bleibt. Ich habe in der Aufgabe die Befehle this.initOwner(primaryStage); und this.initModality(Modality.WINDOW_MODAL); bekommen aber es funktioniert trotzdem nicht. Hat hier vielleicht jemand einen Tipp für mich?
vielen Dank schonmal :)
 

Robat

Top Contributor
Hier gehts nicht um AWT sondern umd JavaFX

Das hatten wir in der Vorlesung nicht und davon steht auch nichts in der Aufgabe oder so
Folgendes funktioniert wunderbar
Java:
public class Main extends Application {
    public static void main(String[] args) {
       launch(args);
    }

    @Override
    public void start( Stage stage ) throws Exception {

        Pane root = new Pane();

        Button openDialog = new Button("Öffnen");
        openDialog.setOnAction(event -> {
            Stage dialogStage = new Stage();
            dialogStage.setTitle("Dialog");
            dialogStage.initOwner(stage);
            dialogStage.initModality(Modality.WINDOW_MODAL);
            dialogStage.show();
        });

        root.getChildren().add(openDialog);

        Scene scene = new Scene(root, 500, 500);
        stage.setScene(scene);
        stage.show();
    }
}
 

dzim

Top Contributor
@horstiii2 der TO verwendet JavaFX...

@Isa_Hope Schwer zu sagen, ohne den vollen Code. @Robat hat zwar prinzipiell recht, dass das hier nach Dialog riecht, aber manchmal ist es tatsächlich wichtig zu wissen, wie man das macht.

Ich hab mal schnell das Beipiel hier erstellt:
https://github.com/bgmf/poc/blob/ma...in/java/eu/dzim/tests/fx/MainMultiWindow.java

Java:
package eu.dzim.tests.fx;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.layout.BorderPane;
import javafx.stage.Modality;
import javafx.stage.Stage;
import javafx.stage.StageStyle;

public class MainMultiWindow extends Application {
    public static void main(String[] args) {
        launch(args);
    }

    Stage primaryStage = null;

    @Override
    public void start(Stage stage) {

        this.primaryStage = stage;

        stage.setTitle("Main Window");
        stage.setMinWidth(640);
        stage.setMinHeight(480);

        Button open = new Button("Show Secondary Window");
        open.setOnAction(e -> {
            showSecondaryStage();
            e.consume();
        });

        BorderPane root = new BorderPane();
        root.setCenter(open);

        Scene scene = new Scene(root, 640, 480);

        stage.setScene(scene);
        stage.show();
    }

    private void showSecondaryStage() {

        Stage stage = new Stage(StageStyle.DECORATED);
        // WINDOW_MODAL = only modal to its owner window(s)
        // APPLICATION_MODAL = modal to every window - Dialogs and alike
        stage.initModality(Modality.APPLICATION_MODAL);
        stage.initOwner(this.primaryStage);
        stage.setTitle("Secondary Window");
        stage.setMinWidth(640);
        stage.setMinHeight(480);

        BorderPane root = new BorderPane();
        root.setCenter(new Label("Secondary Window Content"));

        Scene scene = new Scene(root, 640, 480);

        stage.setScene(scene);
        stage.show();
    }
}
 

Isa_Hope

Mitglied
Vielen Dank! Und wie kriege ich jetzt das andere Fenster da rein?
Ich habe versucht ein neues Objekt von Klasse zwei zu bekommen und dann mit dialogStage.setScene(klasse2.getScene()) das Fenster da reinzukriegen, aber das funktioniert nicht
 

dzim

Top Contributor
@Robat stimme zu: Wir müssen den Code sehen...
Das lol bezog sich daraf, dass du etwas schneller warst als ich. Ich hab erst mal in meinem Repo gesucht, ob ich das nicht schon mal hatte... o_O War nicht der Fall, musste erstellt werden...
 

Robat

Top Contributor
Ich sollte auch mal über so ein Sammelsurium nachdenken. Ich weiß gar nicht wie oft man Dinge zur Erklärung doppelt schreibt :D
 

Isa_Hope

Mitglied
Kann sein dass ich etwas sehr verwirrt bin, ich bin schon seit heute morgen am lernen :D

also ich habe:
also meine erste Klasse ist so wie ihr das oben habt

meine zweite Klasse soll eine Unterklasse von Stage sein also
class Klasse2 extends Stage
und ich habe jetzt das Layout zeug und alles in den Konstruktor(dem eine Stage übergeben wird) geschrieben, weil ich dachte dann wird das Fenster sofort geöffnet wenn ich ein neues Objekt davon erstelle(wenn der button gedrückt wurde), was ja auch funktioniert hat. das Problem ist nur dass dann das erste Fenster sich schliesst
 

Robat

Top Contributor
Meinst du sowas in der Art?
Java:
public class Main extends Application {
    public static void main(String[] args) {
       launch(args);
    }

    @Override
    public void start( Stage stage ) throws Exception {

        Pane root = new Pane();

        Button openDialog = new Button("Öffnen");
        openDialog.setOnAction(event -> {
            DialogStage dialog = new DialogStage(stage);
            dialog.show();
        });

        root.getChildren().add(openDialog);

        Scene scene = new Scene(root, 500, 500);
        stage.setScene(scene);
        stage.show();
    }

    class DialogStage extends Stage {
        public DialogStage(Stage owner) {
            setTitle("Dialog");
            initOwner(owner);
            initModality(Modality.WINDOW_MODAL);
        }
    }
}
 

Isa_Hope

Mitglied
jaa das meine ich
meine zweite Klasse sieht so aus
class Klasse2 extends Stage{
public Klasse2(Stage stage){
//Layout mit controls
//das was in @Robats Klasse steht
}}

wie kriege ich das layout mit den controls in das zweite Fenster rein? :D
 

dzim

Top Contributor
Ich glaube, das Verständnisproblem war/ist, dass man *immer* Stage#show() aufrufen muss, damit das neue Fenster erscheint. Es passiert nichts, wenn man einfach nur eine Stage instanziiert.
 

dzim

Top Contributor
@Isa_Hope es ist sauberer, in einer Klasse nur den Inhalt zu erstellen und dann aussenherum (in dem Button-Listener von Robat oder mir) die Stage zu erstellen. Nicht die Stage an die UI-Klasse geben. Das nennt sich separation of control, glaub ich. Und man sollte nicht zu viele Dinge miteinander vermischen, das ist generell unsauber.
 

dzim

Top Contributor
Zeig die Aufgabe, denn wenn da steht, man muss dem Sub-UI die Stage übergeben, dann scheint der Lehrer keine Ahnung zu haben...
 

Isa_Hope

Mitglied
In der Aufgabe steht: erstellen sie ein Projekt für eine JavaFx Application. Diese Application soll später das Fenster für die Bildererfassung(bei mir Klasse 2) anzeigen.
Erstellen sie für jedes Fenster (also für Bilderfassung) eine eigene Klasse. Diese Klasse soll eine Unterklasse der Klasse Stage sein. Bei der Erfassung soll es sich um einen modalen Dialog handeln
 

dzim

Top Contributor
Im Edit (Stage-Titel hinzugefügt) zu viel gelöscht:

Also dein Lehrer ist echt noch im alten Denken gefangen...

Java:
package eu.dzim.tests.fx;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.Pane;
import javafx.stage.Modality;
import javafx.stage.Stage;
import javafx.stage.StageStyle;
import javafx.stage.Window;

public class MainMultiWindow extends Application {
    public static void main(String[] args) {
        launch(args);
    }

    Stage primaryStage = null;

    @Override
    public void start(Stage stage) {

        this.primaryStage = stage;

        stage.setTitle("Main Window");
        stage.setMinWidth(640);
        stage.setMinHeight(480);

        Button open = new Button("Show Secondary Window");
        open.setOnAction(e -> {
            showSecondaryStage();
            e.consume();
        });

        BorderPane root = new BorderPane();
        root.setCenter(open);

        Scene scene = new Scene(root, 640, 480);

        stage.setScene(scene);
        stage.show();
    }

    private void showSecondaryStage() {

        /*
        Stage stage = new Stage(StageStyle.DECORATED);
        // WINDOW_MODAL = only modal to its owner window(s)
        // APPLICATION_MODAL = modal to every window - Dialogs and alike
        stage.initModality(Modality.APPLICATION_MODAL);
        stage.initOwner(this.primaryStage);
        stage.setTitle("Secondary Window");
        stage.setMinWidth(640);
        stage.setMinHeight(480);

        BorderPane root = new BorderPane();
        root.setCenter(new Label("Secondary Window Content"));

        Scene scene = new Scene(root, 640, 480);

        stage.setScene(scene);
        stage.show();
        */

        DialogStage dialog = new DialogStage(StageStyle.DECORATED,
                Modality.APPLICATION_MODAL,
                primaryStage,
                -1, -1, 320, 240,
                "Title", false);
        // dialog.show();
        dialog.showAndWait();
    }
}

class DialogStage extends Stage {

    private final double width;
    private final double height;

    public DialogStage(StageStyle style, Modality modality, Window owner, double minWidth, double minHeight, double width, double height,
            String title, boolean alwaysOnTop) {

        super(style);

        initModality(modality);
        initOwner(owner);

        if (minWidth > 0)
            setMinWidth(minWidth);
        if (minHeight > 0)
            setMinHeight(minHeight);

        this.width = width;
        this.height = height;

        setTitle(title);
        setAlwaysOnTop(alwaysOnTop);

        createContent();
    }

    private void createContent() {
        Pane content = createContentPane();
        Scene scene = new Scene(content, width, height);
        setScene(scene);
    }

    private Pane createContentPane() {
        BorderPane root = new BorderPane();
        root.setCenter(new Label("Secondary Window Content"));
        return root;
    }
}
 

dzim

Top Contributor
Es funktioniert, aber eigentlich macht man eher eine Klasse, die eine #getView-Methode oder so hat, die ein Pane oder so zurückgibt und dort wo du das Fenster brauchst erstellst du es und machst mit #getView halt den Content der Scene parat... Oder lädst das UI aus einenm FXML...
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Maximieren des Application-Modal Popup-Dialoges+Parent AWT, Swing, JavaFX & SWT 1
E Swing Dialog modal aufrufen AWT, Swing, JavaFX & SWT 2
S Swing Mehrere Modal-Dialoge übereinander AWT, Swing, JavaFX & SWT 5
Bluedaishi JDialog modal und JTextArea AWT, Swing, JavaFX & SWT 4
N Swing Fragen zu non-modal JDialog AWT, Swing, JavaFX & SWT 1
A JDialog (modal) blockiert alle Fenster! AWT, Swing, JavaFX & SWT 2
J Swing JInternalFrame modal setzen? AWT, Swing, JavaFX & SWT 13
B Swing JDialog modal, aber trotzdem Frame auswählbar AWT, Swing, JavaFX & SWT 2
T JPopup modal machen AWT, Swing, JavaFX & SWT 2
W SWT keybinding ESC bzw. [x] bei Shell (modal) AWT, Swing, JavaFX & SWT 2
H JDialog, Modal - Klassenübergreifend => Problem AWT, Swing, JavaFX & SWT 5
J Swing Probmel mit JDialog (Modal/FocusLost/Button) AWT, Swing, JavaFX & SWT 5
K JDialog zeigt keine Komponenten wenn es modal ist AWT, Swing, JavaFX & SWT 2
G JDialog Modal? AWT, Swing, JavaFX & SWT 1
C modal ignorieren? AWT, Swing, JavaFX & SWT 3
J VaterFrame des modal-Dialogs beklickbar AWT, Swing, JavaFX & SWT 12
S "normales" Fenster als modal einstellen AWT, Swing, JavaFX & SWT 2
G JPanel setEnabled modal AWT, Swing, JavaFX & SWT 3
megachucky JInternalFrame modal setzen AWT, Swing, JavaFX & SWT 3
E JFrame soll Modal sein! AWT, Swing, JavaFX & SWT 4
F Dialog (JOptionPane) modal machen AWT, Swing, JavaFX & SWT 3
G Non-Modal JFileChooser erzeugen AWT, Swing, JavaFX & SWT 10
Luma JDialog anpassen unmöglich / JFrame modal machen? AWT, Swing, JavaFX & SWT 10
R JFrame modal machen? AWT, Swing, JavaFX & SWT 3
izoards Java FX Window Event SHOWING AWT, Swing, JavaFX & SWT 17
ruutaiokwu SWT "Google Window Builder" tut keine jar's ins Projekt rein bei SWT-Projekt AWT, Swing, JavaFX & SWT 22
L JavaFX AnchorPane an die Größe der Scene oder Window binden? AWT, Swing, JavaFX & SWT 3
A Objekt von einem Window erstellen? AWT, Swing, JavaFX & SWT 8
S Window Builder AWT, Swing, JavaFX & SWT 20
ralfb1105 JavaFX Wie Text Label in neuem Window von Main Stage setzen? AWT, Swing, JavaFX & SWT 6
C JavaFX Window-Position AWT, Swing, JavaFX & SWT 3
Neumi5694 java.awt.Window nach javafx.stage.Window AWT, Swing, JavaFX & SWT 1
T Custom Window ohne Swing / AWT / FX..?! AWT, Swing, JavaFX & SWT 1
Ghostman1711 GUI Java von Klasse mit Application Windows anderes Application Window aufrufen AWT, Swing, JavaFX & SWT 6
Z Window Builder - Labels mit setText befüllen AWT, Swing, JavaFX & SWT 11
B JavaFX Werte aus eingefügtem Window lesen AWT, Swing, JavaFX & SWT 0
EisKaffee Swing Window Builder installieren AWT, Swing, JavaFX & SWT 1
D SWT Window passt Größe nicht an AWT, Swing, JavaFX & SWT 4
H Drag component out of window AWT, Swing, JavaFX & SWT 1
B Swing "Window Manager" - Gedankenprobleme AWT, Swing, JavaFX & SWT 9
G Window aus anderer Klasse aufrufen AWT, Swing, JavaFX & SWT 4
J Swing Window-Builder-Projekt richtig übertragen AWT, Swing, JavaFX & SWT 2
H Swing Google Window-Builder AWT, Swing, JavaFX & SWT 4
S Flackerndes Window beim DnD AWT, Swing, JavaFX & SWT 37
D SWT CheckBox auslesen (Window Builder Pro) AWT, Swing, JavaFX & SWT 2
frankred Swing Canvas nach "Window-resize" neu Zeichnen lassen wegen Anzeigefehler AWT, Swing, JavaFX & SWT 4
B Swing Window nur bedingt im Vordergrund AWT, Swing, JavaFX & SWT 5
N Window transparent, Komponenten nicht transparent AWT, Swing, JavaFX & SWT 11
R Swing Sequenz aus farbigen Quadraten in Window anzeigen AWT, Swing, JavaFX & SWT 11
J Fehlermeldung adding a window to a container AWT, Swing, JavaFX & SWT 9
L AWT Window, Dialog und verschiedene Betriebssysteme AWT, Swing, JavaFX & SWT 2
3 Eigenes Frame/Window programmieren AWT, Swing, JavaFX & SWT 2
T SWT Window Builder Pro File Dialog anzeigen AWT, Swing, JavaFX & SWT 10
J Swing kann window nicht übergeben AWT, Swing, JavaFX & SWT 14
L Fenster inaktiv setzen / deaktivieren (unable to close window) AWT, Swing, JavaFX & SWT 16
data89 Code-completion-window erzeugen - wie? AWT, Swing, JavaFX & SWT 2
Spin Window Event Beispiel AWT, Swing, JavaFX & SWT 6
H Eclipse View / Window Layout AWT, Swing, JavaFX & SWT 3
T Exception: Adding a window to a container AWT, Swing, JavaFX & SWT 14
M "Window"-Bibilotheck AWT, Swing, JavaFX & SWT 4
I JFrame-Anmerkung "Java Applet Window" entfernen AWT, Swing, JavaFX & SWT 4
T Synchrones Window-verschieben AWT, Swing, JavaFX & SWT 4
K Prompt window in Java? AWT, Swing, JavaFX & SWT 3
S Window über beide Bildschirme maximieren AWT, Swing, JavaFX & SWT 8
F Window#setAlwaysOnTop und Java 1.4.x AWT, Swing, JavaFX & SWT 5
M createImage in Window-Unterklasse AWT, Swing, JavaFX & SWT 4
M Window unterteilen AWT, Swing, JavaFX & SWT 9
R JFrame -- Variable Positionierung durch Window Manager? AWT, Swing, JavaFX & SWT 2
G Window in Taskleiste AWT, Swing, JavaFX & SWT 13
G Window wird angezeigt, nur der Inhalt nicht AWT, Swing, JavaFX & SWT 5
S Window Listener, Exit, bin am Verzweifeln AWT, Swing, JavaFX & SWT 24
U Reaktion auf closing window AWT, Swing, JavaFX & SWT 7
G Listener fuer Window Close AWT, Swing, JavaFX & SWT 2
M not serializable: sun.awt.window.WImage AWT, Swing, JavaFX & SWT 8
N frage ueber D&D von window wie in einige IDE AWT, Swing, JavaFX & SWT 7
P Transparentes Window/JFrame (mit SkinLF?) AWT, Swing, JavaFX & SWT 10
R "Statusbar" - JFrame mit 'Java Applet Window' AWT, Swing, JavaFX & SWT 18
S Performance-Problem: JTextArea als Logging-Window AWT, Swing, JavaFX & SWT 8
J Window Listener funzt nicht richtig AWT, Swing, JavaFX & SWT 5
R Die (J)Frame window listener AWT, Swing, JavaFX & SWT 7

Ähnliche Java Themen

Neue Themen


Oben