GUI Forms - Mehrere Fenster in einem Projekt

zlFavourite

Aktives Mitglied
Hallo, ich schreibe ein kleines Java Projekt. In diesem habe ich mehrere Fenster. Das erste ist z.B. mein Login Fenster, bei dem sich der User erst anmelden muss.
Dieser Code wird beim Starten des Projekts ausgeführt und zeigt das Login Fenster an.
[CODE lang="java" title="Login"]
public static void main(String[] args) throws SQLException {
JFrame frame1 = new JFrame("Login");
frame1.setContentPane(new Login().panelLogin);
frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame1.pack();
frame1.setVisible(true);
frame1.setLocationRelativeTo(null);
frame1.setSize(400,300);
}[/CODE]

Nachdem sich der User erfolgreich angemeldet hat, kommt er zur Hauptseite wo er dann auswählen kann was er machen möchte(dort sollen sich dann auch wieder, je nach Wahl, die Fenster öffnen). Das Hauptfenster öffne ich nachdem sich der User angemeldet hat:
[CODE lang="java" title="Hauptseite öffnen"]
JFrame frame1 = new JFrame("Milchverwaltung");

frame1.setContentPane(new Startpage().panelStart); // Pass this frame (frame1) to Startpage where I set frame1 invisible
frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame1.pack();
frame1.setVisible(true);
frame1.setLocationRelativeTo(null); // Set location to center
frame1.setSize(400,300);[/CODE]

Meine Frage lautet nun wie ich z.B. das Login Fenster wieder schließen/unsichtbar machen kann wenn sich der User eingeloggt hat. Auf das entsprechende frame kann ich nur zugreifen wenn ich das Frame als param übergebe, ist aber schlecht, da ich die Klasse in der das Login Fenster erzeugt wird noch öfter aufrufe und dort keinen param mitgeben kann.

Mein zweite Frage wäre zu den JFrame. Ich habe gelesen, dass es nicht gut ist mehrere JFrame zu verwenden. Gibt es dafür einen besseren Weg oder eine Alternative?

Vielen Danke im voraus 🙂
 
Java:
package application;

import java.io.File;
import java.net.MalformedURLException;

import javafx.scene.Node;
import javafx.scene.layout.StackPane;

public class GuiSwitchController {
    private static StackPane rootStackPane = new StackPane();;
    private static MainMenueView mainMenue = new MainMenueView();
    private static DeckMenueView deckMenue = new DeckMenueView();
    public static void setStyles() throws MalformedURLException {
        mainMenue.getStylesheets().add(new File("mainMenueView.css").toURI().toURL().toExternalForm());
        deckMenue.getStylesheets().add(new File("styleDeck.css").toURI().toURL().toExternalForm());
    }
    public static StackPane getRootStackPane() {
        return rootStackPane;
    }
    private static void clearRootStackpane() {
        rootStackPane.getChildren().clear();
    }

    public static void exitProgramm() {
        System.exit(0);
        // disconnects from server
    }
    public static void setTheDeckScene() {
        clearRootStackpane();
        rootStackPane.getChildren().add(deckMenue);
    }
    public static void setTheMainScene() {
        clearRootStackpane();
        rootStackPane.getChildren().add(GuiSwitchController.mainMenue);
    }

}
ich kann dir nur code in Javafx anbieten aber die idee sollte eig die Gleiche sein...ein Controller kennt die Verschiedenen fenster und der controller selbst ist ein Layout , von dem nimmst die Children weg( die views ) und setzt dann die neue szene so verlierst du deine Views nicht

somit hast ein Pseudo layout das immer die Views wechselt
somit brauchst auch nur noch 1 JFrame weil du 1 Pseudo Node dazwischen hast dann kannst dir das sparen


KEINE AHNUNG wie das bei dir funktioniert aber die idee sollte so shcon mal klar sein
 
Java:
package application;

import java.io.File;
import java.net.MalformedURLException;

import javafx.scene.Node;
import javafx.scene.layout.StackPane;

public class GuiSwitchController {
    private static StackPane rootStackPane = new StackPane();;
    private static MainMenueView mainMenue = new MainMenueView();
    private static DeckMenueView deckMenue = new DeckMenueView();
    public static void setStyles() throws MalformedURLException {
        mainMenue.getStylesheets().add(new File("mainMenueView.css").toURI().toURL().toExternalForm());
        deckMenue.getStylesheets().add(new File("styleDeck.css").toURI().toURL().toExternalForm());
    }
    public static StackPane getRootStackPane() {
        return rootStackPane;
    }
    private static void clearRootStackpane() {
        rootStackPane.getChildren().clear();
    }

    public static void exitProgramm() {
        System.exit(0);
        // disconnects from server
    }
    public static void setTheDeckScene() {
        clearRootStackpane();
        rootStackPane.getChildren().add(deckMenue);
    }
    public static void setTheMainScene() {
        clearRootStackpane();
        rootStackPane.getChildren().add(GuiSwitchController.mainMenue);
    }

}
ich kann dir nur code in Javafx anbieten aber die idee sollte eig die Gleiche sein...ein Controller kennt die Verschiedenen fenster und der controller selbst ist ein Layout , von dem nimmst die Children weg( die views ) und setzt dann die neue szene so verlierst du deine Views nicht

somit hast ein Pseudo layout das immer die Views wechselt
somit brauchst auch nur noch 1 JFrame weil du 1 Pseudo Node dazwischen hast dann kannst dir das sparen


KEINE AHNUNG wie das bei dir funktioniert aber die idee sollte so shcon mal klar sein
Bedeutet ich würde in dem Controller Methoden definieren durch die ich dann die GUI aufrufe oder ?
 
1. Deine Main erstellt den Controller der Ruft setLogin auf -> er setzt sich selbst mit dem Login als kind
2. Auf login klick -> der Controller fügt dem Button die Funnktion hinzu das Aktuelle Child des Controllers zu entfernen uund eine andere View als child zu setzen dann kannst dich so durch die views hangeln
 
so hast du immer die Struktur
JFrame -> Controller(extends Layout) -> Variable View

KEINE AHNUNG wie das exakt geht ich kann nur javafx

aber die ideen sind die gleichen
 
joa schon nur mit der klitzekleinen ausnahme dass der controller selber ein "gui objekt ist " aber den sieht man ja nich und der verändert sich auch nich mehr
Okay. Dann muss ich mal schauen, da ich mir nicht wirklich sicher bin wie ich das umsetze. Wenn ich dann letztendlich ein Controller für mein ganzes Programm habe wird der wahrscheinlich total unübersichtlich, wenn ich zum Schluss für 4 GUI Forms jeweil 10 ActionListener da alleine verarbeiten muss. Verstehst du was ich meine?
 
Okay. Dann muss ich mal schauen, da ich mir nicht wirklich sicher bin wie ich das umsetze. Wenn ich dann letztendlich ein Controller für mein ganzes Programm habe wird der wahrscheinlich total unübersichtlich, wenn ich zum Schluss für 4 GUI Forms jeweil 10 ActionListener da alleine verarbeiten muss. Verstehst du was ich meine?
hat der Switch Controller überhaupt was zu tun mit den funktionen der anderen views?
nicht wirklcih..
Du hast 1 SwitchController und jede View hat zusätzlcih einen controller der für den rest zuständig ist
mvc heist ja nicht 1 view 1 controller 1 model...
verbindungen kannst du ja "machen wie du willst"
 
hat der Switch Controller überhaupt was zu tun mit den funktionen der anderen views?
nicht wirklcih..
Du hast 1 SwitchController und jede View hat zusätzlcih einen controller der für den rest zuständig ist
mvc heist ja nicht 1 view 1 controller 1 model...
verbindungen kannst du ja "machen wie du willst"
Stimmt da hast du recht. Ich habe jetzt einen SwitchController, der die einzelnen GUI Forms dann bereitstellt. Dafür benutze ich auch nur ein Frame. Dadurch ist es mir aber auch nicht möglich die alte GUI Form von welcher ich praktisch zur neuen Form gewechselt habe wenn der User den Button drückt auf visible false zu setzen.
 
du musst mal den Szenen aufbau verstehen sollte denn ein Layout unsichtbar werden ? oder sollte es einfach nicht in der aktuellen GUI dargestellt werden
 
und zeigt das Login Fenster an.
Login wäre ein klassischer Fall für einen modalen JDialog.

Meine Frage lautet nun wie ich z.B. das Login Fenster wieder schließen/unsichtbar machen kann wenn sich der User eingeloggt hat.
Das passiert beim modalen Dialog "automatisch", da der Code erst weiter ausgeführt wird, wenn der Dialog mit dem Anwender beendet ist.

Mein zweite Frage wäre zu den JFrame. Ich habe gelesen, dass es nicht gut ist mehrere JFrame zu verwenden. Gibt es dafür einen besseren Weg oder eine Alternative?
Was als unübersichtlich gilt, sind die klassischen Multiple-Document-Interfaces mit mehreren Fenstern, die in einem gemeinsamen Fenster existieren. Das geht unter Swing auch mit JDesktopPane und JInternalWindow -> ekelhaft.

Ansonsten kann man da nichts pauschal behaupten. Wenn Du den Browser nimmst, kannst Du mehrere Browserfenster haben und/oder mehrere Tabs im Browser öffnen. Auch das ist beides mit Swing möglich (JFrame und JTabbedPane, wobei man da auf Libs zurückgreifen sollte, um closeable Tabs zu bekommen). In OpenOffice bekommst Du für jedes Dokument ein eigenes Fenster. In früheren Word-Versionen war es, wenn ich mich recht entsinne, ein Fenster mit mehreren Dokumenten, von denen in der Regel aber eines das Fenster füllte.

Dann gäbe es auch die Möglichkeit, "Formulare" in einem Fenster auszuwechseln. Hier käme dann das CardLayout in Frage.

Du siehst, Wege gibt es ausreichend, man muss sich nur überlegen, wo man hin will. Am Besten nicht alles selbst machen, sondern zumindest Bibliotheken nutzen. Für große Anwendungen empfiehlt sich der Einsatz eines Frameworks wie z. B. die NetBeans Platform. Bei solchen Lösungen hat man dann allerdings einen gewissen Einarbeitungsaufwand.

Wenn JavaFX passt, kannst Du natürlich auch das statt Swing nutzen.
 
Login wäre ein klassischer Fall für einen modalen JDialog.
Danke für den Hinweis, dann probier ich das mal dafür zu ändern.

Ich möchte für meine Anwendung letztendlich halt nur ein Fenster haben. Dies ist halt für den User einfacher.
Ich möchte da nun eigentlich auch keinen allzu großen Aufwand in die GUI legen.

Ich bin somit aber leider noch nicht weiter gekommen wie ich das nun mit JFrame umsetze.
 
OK, und wie soll das aussehen? Menüeiste und sobald ein Menüpunkt ausgewählt wurde, ändert sich der Fensterinhalt?
ds umzusetzen ist in javafx halt super schick zu lösen und da er in einem anderen thread fx in betracht zieht könnte man es dann mit meinem beispiel oben lösen das beispiel ist aber veraltet nur so fürs protokoll da ist Controller und Model durcheinander gemixt
 

Zurück
Oben