Ich entwickle eine Anwendung, die Bilder anzeigt und Töne 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 oder nicht.
Ich frage mich nur, ob es empfehlenswert ist, mehrere JFrame-Fenster zu verwenden.
java
swing
user-interface
jframe
Hausierer
quelle
quelle
Antworten:
Schlechte (schlechte, schlechte) Praxis.
Es gibt verschiedene Möglichkeiten, viele Elemente in einer GUI anzuzeigen, z.
CardLayout
(kurze Demo. ) Gut für:JInternalFrame
/JDesktopPane
Wird normalerweise für ein MDI verwendet .JTabbedPane
für Gruppen von Komponenten.JSplitPane
Eine Möglichkeit, zwei Komponenten anzuzeigen, deren Wichtigkeit zwischen der einen oder der anderen (der 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 je nach Benutzeranforderung über die GUI gezogen oder ganz entfernt werden. Wie oben erwähnt, wird die Wiederherstellung entsprechend dem übergeordneten Element minimiert / wiederhergestellt.JList
(einfaches Beispiel unten).JTree
.Wenn diese Strategien jedoch für einen bestimmten Anwendungsfall nicht funktionieren, versuchen Sie Folgendes. Richten Sie eine einzelne Hauptleitung ein
JFrame
, und dann werdenJDialog
oderJOptionPane
Instanzen für den Rest der frei schwebenden Elemente angezeigt, wobei der Rahmen als übergeordnetes Element für die Dialoge verwendet wird.Viele Bilder
In diesem Fall, in dem die mehreren Elemente Bilder sind, ist es besser, stattdessen eines der folgenden Elemente zu verwenden:
JLabel
(in einem Bildlaufbereich zentriert), um das Bild anzuzeigen, an dem der Benutzer gerade interessiert ist. Wie in gesehenImageViewer
.JList
. Wie in dieser Antwort zu sehen . Der Teil "einzelne Zeile" davon funktioniert nur, wenn alle die gleichen Abmessungen haben. Alternativ, wenn Sie bereit sind, die Bilder im laufenden Betrieb zu skalieren und alle das gleiche Seitenverhältnis haben (z. B. 4: 3 oder 16: 9).quelle
JFrame
und habe diese Probleme nie in Betracht gezogen, danke für die Erklärung!Der Mehrfachansatz
JFrame
wurde von mir implementiert, seit ich mit der Programmierung von Swing-Apps begonnen habe. Zum größten Teil habe ich es am Anfang gemacht, weil ich es nicht besser wusste. Jedoch , wie ich in meiner Erfahrung und Wissen als Entwickler gereift und begann zu lesen und zu absorbieren die Bewertungen des so viele erfahrenen Java - Online - Devs, machte ich einen Versuch, Abkehr von dem mehrfachenJFrame
Ansatz (sowohl in aktuellen Projekten und zukünftigen Projekten ) nur um auf ... diesen ... Widerstand meiner Kunden zu stoßen! Als ich anfing, modale Dialoge zu implementieren, um "untergeordnete" Fenster undJInternalFrame
s für separate Komponenten zu steuern , begannen meine Kunden sich zu beschweren!Ich war ziemlich überrascht, als ich das tat, was ich für Best Practice hielt! Aber wie sie sagen: "Eine glückliche Frau ist ein glückliches Leben." Gleiches gilt für Ihre Kunden. Natürlich bin ich ein Auftragnehmer, sodass meine Endbenutzer direkten Zugriff auf mich, den Entwickler, haben, was offensichtlich kein alltägliches Szenario ist.Also werde ich die Vorteile des Mehrfachansatzes erklären und
JFrame
einige der Nachteile, die andere vorgestellt haben, mit Mythen zerstören.JFrame
s zulassen, geben Sie Ihrem Endbenutzer die Möglichkeit, die Anzeige auf seinem Bildschirm zu verteilen und zu steuern. Das Konzept fühlt sich "offen" und nicht einschränkend an. Sie verlieren dies, wenn Sie sich einem großenJFrame
und einem HaufenJInternalFrame
s nähern .JFrame
s. Ich wollte jedoch, dass der Dateneingabebildschirm einJDialog
übergeordneter Datenbetrachter ist. Ich nahm die Änderung vor und erhielt sofort einen Anruf von einem Endbenutzer, der sich stark darauf verlassen konnte, dass er den Viewer minimieren oder schließen und den Editor offen halten konnte, während er auf einen anderen Teil des Programms (oder eine Website, die ich nicht verweise, verwies) Ich erinnere mich nicht). Er ist nicht auf einem Multi-Monitor, daher musste der Eingabedialog an erster Stelle stehen und etwas anderesZweitens, mit dem Daten-Viewer völlig versteckt. Dies war mit einem unmöglichJDialog
und wäre mit einem sicherlich auch unmöglich gewesenJInternalFrame
. Ich änderte es widerwillig wieder, umJFrames
für seine geistige Gesundheit getrennt zu sein, aber es brachte mir eine wichtige Lektion bei.JInternalFrame
als ein zu erstellenJFrame
. In der TatJInternalFrames
bieten meiner Erfahrung nach viel weniger Flexibilität. Ich habe eine systematische Methode zum Behandeln des Öffnens und Schließens vonJFrame
s in meinen Apps entwickelt, die wirklich gut funktioniert. Ich steuere den Frame fast vollständig aus dem Code des Frames heraus. die Erstellung des neuen Frames, derSwingWorker
das Abrufen von Daten in Hintergrundthreads und des GUI-Codes in EDT steuert, den Frame wiederherstellt / nach vorne bringt, wenn der Benutzer versucht, ihn zweimal zu öffnen usw. Alles, was Sie zum Öffnen meines Frames benötigen,JFrame
ist Rufen Sie eine öffentliche statische Methodeopen()
und die offene Methode in Kombination mit a aufwindowClosing()
event erledigt den Rest (ist der Frame bereits geöffnet? Ist er nicht geöffnet, sondern wird geladen? usw.) Ich habe diesen Ansatz zu einer Vorlage gemacht, damit es nicht schwierig ist, ihn für jeden Frame zu implementieren.JFrame
mehr Platz benötigt als aJInternalFrame
, selbst wenn Sie 100JFrame
s öffnen , wie viel mehr Ressourcen würden Sie wirklich verbrauchen? Wenn Ihr Problem Speicherlecks aufgrund von Ressourcen sind: Durch das Aufrufen werdendispose()
alle Ressourcen freigegeben, die vom Frame für die Speicherbereinigung verwendet werden (und ich sage erneut, aJInternalFrame
sollte genau dasselbe Problem hervorrufen).Ich habe viel geschrieben und ich habe das Gefühl, ich könnte mehr schreiben. Wie auch immer, ich hoffe, ich werde nicht einfach deshalb herabgestimmt, weil es eine unpopuläre Meinung ist. Die Frage ist eindeutig wertvoll und ich hoffe, ich habe eine wertvolle Antwort gegeben, auch wenn dies nicht die allgemeine Meinung ist.
Ein gutes Beispiel für mehrere Frames / ein einzelnes Dokument pro Frame ( SDI ) im Vergleich zu einem einzelnen Frame / mehreren Dokumenten pro Frame ( MDI ) ist Microsoft Excel. Einige der MDI-Vorteile:
SDI (Single-Document Interface, dh jedes Fenster kann nur ein einziges Dokument haben):
MDI (Multiple-Document Interface, dh jedes Fenster kann mehrere Dokumente enthalten):
quelle
JFrame
und einem großen Elternteil zu habenJTabbedPane
. aber mit der Möglichkeit, ein zweites Fenster (oder noch mehr) zu öffnen, in dem das Layout unterschiedlich sein kann, und somit ein hybrides Verhalten zu bieten, bei dem SDI-Liebhaber glücklich sind und auch MDI-Liebhaber. In allen Fällen habe ich immerJInternalFrame
ein schreckliches Muster betrachtet, das Ihnen alle Unannehmlichkeiten beider Welten bietet. Die Flexibilität, die sie bieten, ist einfach nur zum Kotzen und sie verbrauchen viel wertvollen Platz auf dem Bildschirm für keine wirklichen Zwecke.JFrame
erhält ein eigenes Taskleistensymbol. Manchmal ist es genau das, was Sie wollen, aber manchmal nicht. In WinAPI ist dies einfach zu konfigurieren, in Swing scheint dies jedoch nicht möglich zu sein.JDialog
über a entscheidenJFrame
.Ich möchte dem Argument "nicht benutzerfreundlich" mit einem Beispiel begegnen, 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 in diesem einzigen Fenster zu belassen.
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-Seite (n) im Hoch- / Querformat des Berichts an, sodass die Benutzer dieses Fenster als ziemlich groß betrachten und fast ihre Bildschirme ausfüllen.
Vor einigen Monaten haben wir Anfragen von unseren Kunden erhalten, diese Berichts-Viewer-Fenster modelllos zu machen, damit mehrere Berichte gleichzeitig geöffnet sein können.
Einige Zeit habe ich mich dieser Bitte widersetzt, da ich dies nicht für eine gute Lösung hielt. Meine Meinung wurde jedoch geändert, als ich herausfand, wie die Benutzer diesen „Mangel“ unseres Systems umgehen konnten.
Sie öffneten einen Viewer und speicherten den Bericht mithilfe der Funktion "Speichern unter" als PDF in einem bestimmten Verzeichnis. Mit Acrobat Reader öffneten sie die PDF-Datei und machten dasselbe mit dem nächsten Bericht. Sie würden mehrere Acrobat Readers mit den verschiedenen Berichtsausgaben ausführen, die sie betrachten wollten.
Also gab ich nach und machte den Betrachter modelllos. Dies bedeutet, dass jeder Betrachter ein Taskleistensymbol hat.
Als ihnen letzte Woche die neueste Version veröffentlicht wurde, ist die überwältigende Antwort von ihnen, dass sie es lieben. Es war eine unserer beliebtesten jüngsten Verbesserungen des Systems.
Sie sagen Ihren Benutzern also, dass das, was sie wollen, schlecht ist, aber letztendlich wird es Ihnen keinen Gefallen tun.
EINIGE NOTIZEN:
ModalityType
und nicht das booleschemodal
Argument verwenden. Dies gibt diesen Dialogen das Taskleistensymbol.quelle
Machen Sie einen jInternalFrame zum Hauptframe und machen Sie ihn unsichtbar. Dann können Sie es für weitere Ereignisse verwenden.
quelle
Es ist eine Weile her, seit ich das letzte Mal Swing berührt habe, aber im Allgemeinen ist es eine schlechte Praxis, dies zu tun. Einige der Hauptnachteile, die mir in den Sinn kommen:
Es ist teurer: Sie müssen viel mehr Ressourcen zuweisen, um einen JFrame als eine andere Art von Fenstercontainer wie Dialog oder JInternalFrame zu zeichnen.
Nicht benutzerfreundlich: Es ist nicht einfach, in eine Reihe von zusammengeklebten JFrames zu navigieren. Es sieht so aus, als ob Ihre Anwendung eine Reihe von Anwendungen ist, die inkonsistent und schlecht gestaltet sind.
Es ist einfach, JInternalFrame zu verwenden. Dies ist eine Art Retorical. Jetzt ist es viel einfacher und andere Leute sind schlauer (oder haben mehr Freizeit), als wir bereits über das Desktop- und JInternalFrame-Muster nachgedacht haben. Daher würde ich empfehlen, es zu verwenden.
quelle
JInternalFrame
? Persönlich bin ich mit der Verwendung vonJInternalFrame
's nicht einverstanden !CardLayout
ist ein wahrer Segen!JInternalFrame
bietet in keinem der drei von Ihnen genannten Fälle Vorteile (1. Wo ist der Beweis, derJInternalFrame
leichter ist alsJFrame
? 2. IhrJInternalFrame
s könnte genauso überladen / chaotisch / zusammengeklebt sein wie ein Haufen vonJFrame
s. 3. Wie ist esJInternalFrame
einfacher? Es ist das der gleiche genaue Code, außer dass einer in aJDesktopPane
und einer im natürlichen Bildschirmbereich enthalten ist. Sie klingen für mich gleich komplex.)JComponent
s, beide haben fast identische Strukturen, außer dass eines auf a gerendert wirdJDesktop
und eines nicht. Nochmals, sorry, aber ich glaube, Sie spekulieren über das "Gewicht" vonJFrame
. 2. Meine Anwendungen verwenden SDI und meine Kunden sind sehr zufrieden. Sie sagten jedoch "eine Menge Fenster", was natürlich scheiße wäre. Aber mein Punkt ist: "Eine Tonne"JInternalFrame
würde genauso schlecht saugen! Wenn Sie sagen, dass JIFs es Ihnen ermöglichen, ein schlampiger UI-Designer zu sein, dann ist das schrecklich. Ein überladenes Durcheinander ist ein überladenes Durcheinander, egal ob JF oder JIF.Schlechte Praxis auf jeden Fall. Ein Grund dafür ist, dass es nicht sehr "benutzerfreundlich" ist, da jedes
JFrame
ein neues Taskleistensymbol anzeigt. Wenn Sie mehrereJFrame
s steuern, werden Sie sich die Haare ausreißen.Persönlich würde ich ONE
JFrame
für Ihre Art von Anwendung verwenden. Es liegt an Ihnen, wie Sie mehrere Dinge anzeigen können. Es gibt viele.Canvas
es,JInternalFrame
,CardLayout
, auchJPanel
s möglicherweise.Mehrere JFrame-Objekte = Schmerzen, Probleme und Probleme.
quelle
Ich denke, mehrere
Jframe
s zu verwenden ist keine gute Idee.Stattdessen können wir
JPanel
s mehr als ein oder mehrereJPanel
gleichzeitig verwendenJFrame
.Auch können wir zwischen diesen
JPanel
s wechseln . Es gibt uns also die Freiheit, mehr als nur etwas in der zu zeigenJFrame
.Für jedes können
JPanel
wir verschiedene Dinge entwerfen und all diesJPanel
kann einzeln angezeigtJFrame
werden.Zwischen diesen wechseln
JPanel
s VerwendungJMenuBar
mitJMenuItems
für jedenJPanel
oder ‚JButtonfor each
JPanel`.Mehr als eine
JFrame
ist keine gute Praxis, aber es ist nichts falsch, wenn wir mehr als eine wollenJFrame
.Aber es ist besser, eine
JFrame
für unsere unterschiedlichen Bedürfnisse zu ändern, als mehrere zu habenJFrame
.quelle
Wenn die Frames dieselbe Größe haben sollen, erstellen Sie den Frame und übergeben Sie ihn stattdessen als Referenz.
Wenn Sie den Frame übergeben haben, können Sie entscheiden, wie er gefüllt werden soll. Es wäre, als hätte man eine Methode zur Berechnung des Durchschnitts einer Reihe von Zahlen. Würden Sie die Methode immer und immer wieder erstellen?
quelle
Es ist keine gute Praxis, 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, es ist gut.
quelle