webentwicklung-frage-antwort-db.com.de

Die Verwendung mehrerer JFrames: Gute oder schlechte Praxis?

Ich entwickle eine Anwendung, die Bilder anzeigt und Sounds aus einer Datenbank wiedergibt. Ich versuche zu entscheiden, ob ein separater JFrame zum Hinzufügen von Bildern zur Datenbank über die GUI verwendet werden soll.

Ich frage mich nur, ob es sinnvoll ist, mehrere JFrame-Fenster zu verwenden.

521
Peddler

Ich frage mich nur, ob es sinnvoll ist, mehrere JFrames zu verwenden.

Schlechte (schlechte, schlechte) Praxis.

  • Benutzer unfreundlich: Der Benutzer sieht mehrere Symbole in seiner Taskleiste, wenn er erwartet, nur eines zu sehen. Plus die Nebenwirkungen der Codierungsprobleme.
  • Ein Albtraum zum Programmieren und Pflegen:
    • Ein modaler Dialog bietet die einfache Möglichkeit, die Aufmerksamkeit auf den Inhalt dieses Dialogs zu lenken - wählen/korrigieren/abbrechen, und dann Vorgehen. Mehrere Frames nicht.
    • Ein Dialogfeld (oder eine schwebende Symbolleiste) mit einem übergeordneten Element wird angezeigt, wenn das übergeordnete Element angeklickt wird. Wenn dies das gewünschte Verhalten ist, müssen Sie dies in Frames implementieren.

Es gibt eine beliebige Anzahl von Möglichkeiten, um viele Elemente in einer GUI anzuzeigen, z.

  • CardLayout (kurz Demo. ). Gut für:
    1. Assistentenähnliche Dialoge anzeigen.
    2. Anzeigen von Listen-, Baum- usw. Auswahlen für Elemente, denen eine Komponente zugeordnet ist.
    3. Zwischen keiner Komponente und sichtbarer Komponente wechseln.
  • JInternalFrame/JDesktopPane wird normalerweise für MDI verwendet.
  • JTabbedPane für Gruppen von Komponenten.
  • JSplitPane Eine Möglichkeit, zwei Komponenten anzuzeigen, deren Wichtigkeit zwischen den beiden Komponenten (die Größe) je nach dem, was der Benutzer tut, variiert.
  • JLayeredPane weit viele gut geschichtete Komponenten.
  • JToolBar enthält normalerweise Gruppen von Aktionen oder Steuerelementen. Kann auf der Benutzeroberfläche verschoben oder ganz nach Bedarf entfernt werden. Wie oben erwähnt, wird minimiert/wiederhergestellt, je nach übergeordnetem Element.
  • Als Elemente in einem JList (einfaches Beispiel unten).
  • Als Knoten in einem JTree .
  • Verschachtelte Layouts .

Wenn diese Strategien für einen bestimmten Anwendungsfall nicht funktionieren, versuchen Sie Folgendes. Stellen Sie ein einzelnes Haupt-JFrame her und lassen Sie dann JDialog oder JOptionPane Instanzen für den Rest des Free Floating erscheinen Elemente, wobei der Rahmen als übergeordnetes Element für die Dialogfelder verwendet wird.

Viele bilder

In diesem Fall, in dem die mehreren Elemente Bilder sind, ist es besser, stattdessen eine der folgenden Optionen zu verwenden:

  1. Ein einzelnes JLabel (in einem Bildlauffenster zentriert), um das Bild anzuzeigen, an dem der Benutzer gerade interessiert ist. Wie in ImageViewer gesehen.
  2. Eine einzelne Zeile JList. Wie in diese Antwort gesehen. Der einreihige Teil davon funktioniert nur, wenn sie alle die gleichen Dimensionen haben. Alternativ, wenn Sie bereit sind, die Bilder im Handumdrehen zu skalieren und alle dasselbe Seitenverhältnis haben (z. B. 4: 3 oder 16: 9).

438
Andrew Thompson

Ich möchte dem "nicht benutzerfreundlichen" Argument ein Beispiel entgegensetzen, an dem ich gerade beteiligt war.

In unserer Anwendung haben wir ein Hauptfenster, in dem die Benutzer verschiedene "Programme" als separate Registerkarten ausführen. Wir haben so viel wie möglich versucht, unsere Anwendung auf dieses einzelne Fenster zu beschränken.

Eines der von ihnen ausgeführten Programme enthält eine Liste der vom System generierten Berichte. Der Benutzer kann in jeder Zeile auf ein Symbol klicken, um ein Dialogfeld zur Berichtsanzeige zu öffnen. Dieser Viewer zeigt das Äquivalent der A4-Seiten im Hoch-/Querformat des Berichts an, sodass die Benutzer dieses Fenster als recht groß ansehen und fast ihren gesamten Bildschirm ausfüllen möchten.

Vor ein paar Monaten erhielten wir von unseren Kunden Anfragen, diese Report Viewer-Fenster modeln zu lassen, damit sie mehrere Berichte gleichzeitig öffnen können.

Einige Zeit widerstand ich dieser Bitte, da ich dies nicht für eine gute Lösung hielt. Meine Meinung wurde jedoch geändert, als ich herausfand, wie die Benutzer dieses "Defizit" unseres Systems umgehen.

Sie öffneten einen Viewer und verwendeten die Funktion "Speichern unter", um den Bericht als PDF in einem bestimmten Verzeichnis zu speichern. Mit Acrobat Reader wurde PDF) geöffnet Das Gleiche gilt für den nächsten Bericht. Auf ihnen werden mehrere Acrobat Reader mit den verschiedenen Berichtsausgaben ausgeführt, die sie anzeigen möchten.

Also gab ich nach und machte den Betrachter zur Modeless. Dies bedeutet, dass jeder Viewer über ein Taskleistensymbol verfügt.

Als letzte Woche die neueste Version für sie veröffentlicht wurde, ist die überwältigende Antwort von ihnen, dass sie es LIEBEN. Dies ist eine unserer beliebtesten Verbesserungen in letzter Zeit.

Also sagen Sie Ihren Nutzern, dass das, was sie wollen, schlecht ist, aber letztendlich wird es Ihnen keinen Gefallen tun.

EINIGE NOTIZEN:

  • Es scheint die beste Praxis zu sein, JDialogs für diese Fenster ohne Modell zu verwenden
  • Verwenden Sie die Konstruktoren, die das neue ModalityType und nicht das boolesche modal Argument verwenden. Dies gibt diesen Dialogen das Taskleistensymbol.
  • Übergeben Sie bei nicht modalen Dialogen ein Null-Elternelement an den Konstruktor, aber suchen Sie sie relativ zu ihrem "Eltern" -Fenster.
  • Version 6 von Java unter Windows hat ein Fehler , was bedeutet, dass Ihr Hauptfenster "immer im Vordergrund" sein kann, ohne dass Sie es mitteilen. Aktualisieren Sie auf Version 7, um dieses Problem zu beheben
51
DuncanKinnear

Machen Sie einen jInternalFrame zum Hauptrahmen und machen Sie ihn unsichtbar. Dann können Sie es für weitere Veranstaltungen nutzen.

jInternalFrame.setSize(300,150);
jInternalFrame.setVisible(true);

Es ist schon eine Weile her, dass ich Swing das letzte Mal berühre, aber im Allgemeinen ist es eine schlechte Übung, dies zu tun. Einige der wichtigsten Nachteile, die in den Sinn kommen:

  • Es ist teurer: Sie müssen viel mehr Ressourcen zuweisen, um einen JFrame zu zeichnen, der eine andere Art von Fenstercontainer ist, z. B. Dialog oder JInternalFrame.

  • Nicht benutzerfreundlich: Es ist nicht einfach, in eine Reihe von zusammengeklebten JFrame-Anwendungen zu navigieren. Ihre Anwendung scheint eine Reihe von Anwendungen zu sein, die inkonsistent sind und ein schlechtes Design aufweisen.

  • Es ist einfach, JInternalFrame zu verwenden Das ist etwas retorisch, jetzt ist es viel einfacher und andere Leute sind schlauer (oder haben mehr Freizeit), als wir es uns bereits überlegt haben, und ich würde es empfehlen benutze es.

18
Necronet

Auf jeden Fall schlechtes Training. Ein Grund dafür ist, dass es nicht sehr benutzerfreundlich ist, weil in jedem JFrame ein neues Taskleistensymbol angezeigt wird. Wenn Sie mehrere JFrames steuern, werden Sie sich die Haare ausreißen.

Persönlich würde ich EIN JFrame für Ihre Art der Anwendung verwenden. Es liegt an Ihnen, wie Sie mehrere Dinge anzeigen, es gibt viele. Canvases, JInternalFrame, CardLayout, möglicherweise sogar JPanels.

Mehrere JFrame-Objekte = Schmerz, Ärger und Probleme.

10
Matt Dawsey

Ich halte die Verwendung mehrerer Jframes nicht für eine gute Idee.

Stattdessen können wir JPanels mehr als ein oder mehrere JPanel im selben JFrame verwenden.

Wir können auch zwischen diesen JPanels wechseln. Es gibt uns also die Freiheit, mehr als nur eine Sache im JFrame anzuzeigen.

Für jedes JPanel können wir verschiedene Dinge entwerfen und all dies JPanel kann auf dem einzelnen JFrameon zu einem Zeitpunkt angezeigt werden.

Um zwischen diesen JPanels zu wechseln, verwenden Sie JMenuBar mit JMenuItems für jeden JPaneloder 'JButtonfor eachJPanel`.

Mehr als ein JFrame ist keine gute Praxis, aber es ist nichts falsch, wenn wir mehr als ein JFrame wollen.

Aber es ist besser, einen JFrame für unsere unterschiedlichen Bedürfnisse zu ändern, als mehrere JFrame zu haben.

7
Lijo

Wenn die Frames dieselbe Größe haben, erstellen Sie den Frame und übergeben Sie ihn stattdessen als Referenz.

Wenn Sie den Frame durchlaufen haben, können Sie entscheiden, wie Sie ihn füllen möchten. Es wäre, als hätte man eine Methode zur Berechnung des Durchschnitts einer Zahlenmenge. Würden Sie die Methode immer wieder erstellen?

5
Keith Spriggs

Es ist keine gute Übung, aber obwohl Sie es verwenden möchten, können Sie das Singleton-Muster als gut verwenden. Ich habe die Singleton-Muster in den meisten meiner Projekte verwendet.

4
arunjoseph