Je développe une application qui affiche des images et lit les sons d'une base de données. J'essaie de décider d'utiliser ou non un JFrame séparé pour ajouter des images à la base de données à partir de l'interface graphique.
Je me demande simplement s'il est judicieux d'utiliser plusieurs fenêtres JFrame?
Je me demande simplement si c'est une bonne pratique d'utiliser plusieurs JFrames?
Mauvaise (mauvaise, mauvaise) pratique.
Il existe un grand nombre de façons d'afficher de nombreux éléments dans une interface graphique, par exemple:
CardLayout
(court démo. ). Bon pour:JInternalFrame
/JDesktopPane
généralement utilisé pour un MDI .JTabbedPane
pour les groupes de composants.JSplitPane
Manière d'afficher deux composants dont l'importance entre l'un ou l'autre (la taille) varie en fonction de ce que l'utilisateur fait.JLayeredPane
Beaucoup de composants bien superposés.JToolBar
contient généralement des groupes d'actions ou de contrôles. Peut être déplacé autour de l'interface graphique ou entièrement en fonction des besoins de l'utilisateur. Comme mentionné ci-dessus, minimisera/restaurera en fonction du parent.JList
(exemple simple ci-dessous).JTree
.Mais si ces stratégies ne fonctionnent pas pour un cas d'utilisation particulier, essayez ce qui suit. Établissez une seule JFrame
principale, puis ayez JDialog
ou JOptionPane
pour le reste des éléments flottants, à l'aide du cadre en tant que parent pour les dialogues.
Dans le cas où les éléments multiples sont des images, il serait préférable d'utiliser l'un des éléments suivants:
JLabel
(centré dans un panneau de défilement) pour afficher l’image qui intéresse l’utilisateur à ce moment. Comme on le voit dans ImageViewer
.JList
. Comme on le voit dans cette réponse . La partie "une seule ligne" de cela ne fonctionne que si elles ont toutes les mêmes dimensions. Sinon, si vous êtes prêt à redimensionner les images à la volée, elles auront toutes le même rapport de format (par exemple, 4: 3 ou 16: 9).L'approche multiple JFrame
est une chose que j'ai implémentée depuis que j'ai commencé à programmer des applications Swing. Pour la plupart, je l'ai fait au début parce que je ne connaissais pas mieux. Cependant , au fur et à mesure que je mûris dans mon expérience et mes connaissances de développeur et que je commençais à lire et à absorber les opinions de beaucoup plus expérimentés Java _ devs online, j’ai essayé de changer de l’approche multiple JFrame
(dans les projets en cours et les projets futurs) uniquement être rencontré ... obtenir cette ... résistance de mes clients! Lorsque j'ai commencé à mettre en place des dialogues modaux pour contrôler les fenêtres "enfants" et JInternalFrame
s pour des composants séparés, mes clients ont commencé à se plaindre! J'ai été assez surpris, car je faisais ce que je pensais être la meilleure pratique! Mais, comme on dit, "une femme heureuse est une vie heureuse". Il en va de même pour vos clients. Bien sûr, je suis un contractant et mes utilisateurs finaux ont un accès direct à moi, le développeur, ce qui n’est évidemment pas un scénario courant.
Je vais donc expliquer les avantages de l'approche multiple JFrame
, ainsi que des contre-mythes présentés ci-dessous.
JFrame
s séparés, vous donnez à l'utilisateur final la possibilité de répartir et de contrôler le contenu de son contenu. écran. Le concept se sent "ouvert" et non contraignant. Vous perdez cela lorsque vous vous dirigez vers un gros JFrame
et un tas de JInternalFrame
s.JFrame
s. Cependant, je voulais que l'écran de saisie de données soit un JDialog
dont le parent était le visualiseur de données. J'ai effectué le changement et j'ai immédiatement reçu un appel d'un utilisateur final qui s'est fortement appuyé sur le fait qu'il pouvait minimiser ou fermer le visualiseur et le conserver. l'éditeur s'ouvrait alors qu'il faisait référence à une autre partie du programme (ou à un site Web, je ne m'en souviens pas). Il n'est pas sur un moniteur multiple, il avait donc besoin que le dialogue de saisie soit le premier et quelque chose d'autre être deuxième, avec la visionneuse de données complètement cachée. Cela était impossible avec un JDialog
et aurait certainement été impossible avec un JInternalFrame
. Je l'ai changé à contrecœur pour qu'il soit séparé JFrames
pour sa santé mentale, mais cela m'a appris une leçon importante.JInternalFrame
qu'un JFrame
. En fait, d'après mon expérience, JInternalFrames
offre beaucoup moins de flexibilité. J'ai développé un moyen systématique de gérer l'ouverture et la fermeture de JFrame
s dans mes applications, qui fonctionne vraiment bien. Je contrôle le cadre presque complètement depuis le code même du cadre; la création du nouveau cadre, SwingWorker
s qui contrôlent l'extraction des données sur les threads d'arrière-plan et le code d'interface graphique sur l'EDT, la restauration/le rapprochement du cadre si l'utilisateur tente de l'ouvrir deux fois, etc. Tout ce dont vous avez besoin open my JFrame
s est une méthode statique publique open()
et la méthode open, associée à un événement windowClosing()
, gère le reste (le cadre est-il déjà ouvert? n'est-il pas ouvert, mais se charge-t-il? etc.) J'ai fait de cette approche un modèle pour que ce ne soit pas difficile à implémenter pour chaque image.JFrame
a besoin de plus d'espace qu'un JInternalFrame
, même si vous ouvrez 100 JFrame
s, combien de ressources consommeriez-vous réellement? Si votre préoccupation est une fuite de mémoire à cause de ressources: l'appel de dispose()
libère toutes les ressources utilisées par le cadre pour le nettoyage de la mémoire (et, encore une fois, un JInternalFrame
doit invoquer exactement le même problème).J'ai beaucoup écrit et je sens que je pourrais écrire plus. Quoi qu'il en soit, j'espère ne pas être voté simplement parce que c'est un avis impopulaire. La question est clairement précieuse et j'espère avoir fourni une réponse valable, même si ce n'est pas l'opinion commune.
Un excellent exemple de plusieurs images/document unique par image ( SDI ) vs une seule image/plusieurs documents par image ( MDI ) est Microsoft Excel. Certains des MDI avantages:
SDI (interface à document unique, c'est-à-dire que chaque fenêtre ne peut contenir qu'un seul document):
MDI (interface à plusieurs documents, c’est-à-dire que chaque fenêtre peut avoir plusieurs documents):
J'aimerais contrer l'argument "pas convivial" avec un exemple avec lequel je viens d'être impliqué.
Dans notre application, nous avons une fenêtre principale dans laquelle les utilisateurs exécutent divers "programmes" sous forme d'onglets distincts. Dans la mesure du possible, nous avons essayé de conserver notre application dans cette fenêtre unique.
L'un des "programmes" qu'ils exécutent présente une liste de rapports générés par le système. L'utilisateur peut cliquer sur une icône sur chaque ligne pour ouvrir une boîte de dialogue d'affichage du rapport. Ce lecteur affiche l'équivalent de la ou des pages A4 de portrait/paysage du rapport, de sorte que les utilisateurs aiment que cette fenêtre soit assez grande, remplissant presque leurs écrans.
Il y a quelques mois, nous avons commencé à recevoir des demandes de nos clients pour que ces fenêtres de visualisation de rapports soient sans modèle, afin qu'elles puissent avoir plusieurs rapports ouverts en même temps.
Pendant un certain temps, j'ai résisté à cette demande car je ne pensais pas que c'était une bonne solution. Cependant, mon esprit a changé lorsque j'ai découvert comment les utilisateurs résolvaient cette "déficience" de notre système.
Ils ouvraient une visionneuse en utilisant la fonction "Enregistrer sous" pour enregistrer le rapport en tant que PDF dans un répertoire spécifique, en utilisant Acrobat Reader pour ouvrir le fichier PDF. Faites de même avec le prochain rapport. Plusieurs lecteurs Acrobat s'exécutaient avec les différentes sorties de rapport qu'ils souhaitaient consulter.
J'ai donc cédé et j'ai rendu le spectateur sans modèle. Cela signifie que chaque visualiseur a une icône dans la barre des tâches.
Lorsque la dernière version leur a été publiée la semaine dernière, la réponse écrasante d'eux est qu'ils l'aiment. C'est l'une des améliorations les plus récentes apportées au système.
Vous dites donc à vos utilisateurs que ce qu'ils veulent est mauvais, mais que cela ne vous rendra finalement pas service.
QUELQUES NOTES:
ModalityType
plutôt que l'argument booléen modal
. C'est ce qui donne à ces boîtes de dialogue l'icône de la barre des tâches.Créez un cadre jInternalFrame dans le cadre principal et rendez-le invisible. Ensuite, vous pouvez l'utiliser pour d'autres événements.
jInternalFrame.setSize(300,150);
jInternalFrame.setVisible(true);
Cela fait longtemps que je n’ai pas touché au swing, mais c’est en général une mauvaise pratique de le faire. Certains des principaux inconvénients qui me viennent à l’esprit:
C'est plus cher : vous devrez allouer beaucoup plus de ressources pour dessiner un JFrame avec un autre type de conteneur de fenêtre, tel que Dialog ou JInternalFrame.
Pas convivial: Il n'est pas facile de naviguer dans un groupe de JFrame collés ensemble, il semblerait que votre application soit un ensemble d'applications incohérentes et mal conçues.
Il est facile d’utiliser JInternalFrame C’est un peu rétorique, c’est maintenant beaucoup plus facile et que les autres personnes sont plus intelligentes (ou avec plus de temps libre) que nous n’avons déjà réfléchi au modèle Desktop et JInternalFrame. utilise le.
Mauvaise pratique définitivement. Une des raisons est qu’il n’est pas très convivial de voir que chaque JFrame
affiche une nouvelle icône dans la barre des tâches. Contrôler plusieurs JFrame
s vous fera déchirer vos cheveux.
Personnellement, j'utiliserais ONE JFrame
pour votre type d'application. Les méthodes d'affichage de plusieurs choses sont à vous, il y en a beaucoup. Canvas
es, JInternalFrame
, CardLayout
, voire JPanel
s éventuellement.
Plusieurs objets JFrame = Douleur, problèmes et problèmes.
Je pense qu’utiliser plusieurs Jframe
s n’est pas une bonne idée.
Au lieu de cela, nous pouvons utiliser JPanel
s plus d'un ou plusieurs JPanel
dans le même JFrame
.
Nous pouvons aussi basculer entre cette JPanel
s. Cela nous donne donc la liberté d’afficher plus que dans la JFrame
.
Pour chaque JPanel
nous pouvons concevoir différentes choses et tout cela JPanel
peut être affiché sur l'unique JFrame
une à la fois.
Pour basculer entre cette JPanel
s, utilisez JMenuBar
avec JMenuItems
pour chaque JPanel
ou 'JButtonfor each
JPanel`.
Plus d'un JFrame
n'est pas une bonne pratique, mais rien ne nous empêche de vouloir plus d'un JFrame
.
Mais il vaut mieux changer une JFrame
pour nos différents besoins plutôt que d’avoir plusieurs JFrame
s.
Si les cadres ont la même taille, pourquoi ne pas le créer et le transmettre ensuite comme référence.
Lorsque vous avez passé le cadre, vous pouvez alors décider comment le remplir. Ce serait comme avoir une méthode pour calculer la moyenne d'un ensemble de chiffres. Souhaitez-vous créer la méthode, encore et encore?
Ce n'est pas une bonne pratique, mais même si vous souhaitez l'utiliser, vous pouvez utiliser le motif singleton comme bon. J'ai utilisé les modèles de singleton dans la plupart de mes projets.