Je développe une application qui affiche des images et lit des sons à partir d'une base de données. J'essaie de décider d'utiliser ou non un JFrame distinct pour ajouter des images à la base de données à partir de l'interface graphique.
Je me demande simplement si c'est une bonne pratique d'utiliser plusieurs fenêtres JFrame?
java
swing
user-interface
jframe
Colporteur
la source
la source
Réponses:
Mauvaise (mauvaise, mauvaise) pratique.
Il existe de nombreuses façons d'afficher de nombreux éléments dans une seule interface graphique, par exemple:
CardLayout
(courte démo. ). Bon pour:JInternalFrame
/JDesktopPane
généralement utilisé pour un MDI .JTabbedPane
pour les groupes de composants.JSplitPane
Une manière d'afficher deux composants dont l'importance entre l'un ou l'autre (la taille) varie selon ce que fait l'utilisateur.JLayeredPane
beaucoup de composants bien .. superposés.JToolBar
contient généralement des groupes d'actions ou de contrôles. Peut être glissé autour de l'interface graphique ou entièrement en fonction des besoins des utilisateurs. Comme mentionné ci-dessus, minimisera / restaurera selon le parent qui le fait.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 un principal
JFrame
, puis faites apparaîtreJDialog
ou desJOptionPane
instances pour le reste des éléments flottants, en utilisant le cadre comme parent pour les boîtes de dialogue.Beaucoup d'images
Dans ce cas où les éléments multiples sont des images, il serait préférable d'utiliser à la place l'un des éléments suivants:
JLabel
(centré dans un volet de défilement) pour afficher l'image qui intéresse l'utilisateur à ce moment. Comme vu dansImageViewer
.JList
. Comme on le voit dans cette réponse . La partie "une seule ligne" de cela ne fonctionne que si elles sont toutes de mêmes dimensions. Alternativement, si vous êtes prêt à mettre à l'échelle les images à la volée, et qu'elles ont toutes le même rapport d'aspect (par exemple 4: 3 ou 16: 9).la source
JFrame
s auparavant et n'avais jamais considéré ces problèmes, merci de m'avoir expliqué!L'
JFrame
approche multiple est quelque chose que j'ai mis en œuvre depuis que j'ai commencé à programmer des applications Swing. Pour la plupart, je l'ai fait au début parce que je ne savais pas mieux. Cependant , à mesure que je grandissais dans mon expérience et mes connaissances en tant que développeur et que je commençais à lire et à absorber les opinions de nombreux développeurs Java plus expérimentés en ligne, j'ai essayé de m'éloigner de l'JFrame
approche multiple (à la fois dans les projets actuels et futurs). ) seulement à rencontrer ... obtenez ceci ... résistance de mes clients! Alors que je commençais à implémenter des boîtes de dialogue modales pour contrôler les fenêtres "enfants" etJInternalFrame
les composants séparés, mes clients ont commencé à se plaindre!J'étais assez surpris, car je faisais ce que je pensais être les meilleures pratiques! 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 entrepreneur, donc mes utilisateurs finaux ont un accès direct à moi, le développeur, ce qui n'est évidemment pas un scénario courant.Donc, je vais expliquer les avantages de l'
JFrame
approche multiple , ainsi que briser les mythes certains des inconvénients que d'autres ont présentés.JFrame
s séparés , vous donnez à votre utilisateur final la possibilité d'étaler et de contrôler ce qui est sur son écran. Le concept semble "ouvert" et non contraignant. Vous perdez cela lorsque vous vous dirigez vers un grosJFrame
et un tas deJInternalFrame
s.JFrame
le par. Cependant, je voulais que l'écran de saisie des données soit celuiJDialog
dont le parent était le visualiseur de données. J'ai fait le changement et j'ai immédiatement reçu un appel d'un utilisateur final qui comptait beaucoup sur le fait qu'il pouvait réduire ou fermer le visualiseur et garder l' éditeur ouvert pendant qu'il faisait référence à une autre partie du programme (ou à un site Web, je ne ne me souviens pas). Il n'est pas sur un multi-moniteur, donc il avait besoin que la boîte de dialogue d'entrée soit la première et autre choseêtre deuxième, avec la visionneuse de données complètement cachée. C'était impossible avec unJDialog
et aurait certainement été impossible avec unJInternalFrame
aussi. Je l'ai changé à contrecœur pour être séparéJFrames
pour sa raison, mais cela m'a appris une leçon importante.JInternalFrame
qu'unJFrame
. En fait, selon 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 deJFrame
s dans mes applications qui fonctionne vraiment bien. Je contrôle le cadre presque complètement à partir du code du cadre lui-même; la création du nouveau cadre,SwingWorker
qui contrôle la récupération des données sur les threads d'arrière-plan et le code GUI sur EDT, la restauration / mise en avant du cadre si l'utilisateur essaie de l'ouvrir deux fois, etc. Tout ce dont vous avez besoin pour ouvrir monJFrame
s est appeler une méthode statique publiqueopen()
et la méthode ouverte, combinée avec unwindowClosing()
l'événement 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 donc ce n'est pas difficile à implémenter pour chaque cadre.JFrame
espace nécessite plus d'espace qu'unJInternalFrame
, même si vous ouvrez 100JFrame
s, combien de ressources supplémentaires consommeriez-vous vraiment? Si votre problème concerne les fuites de mémoire en raison de ressources: l'appeldispose()
libère toutes les ressources utilisées par le cadre pour la collecte des ordures (et, je le répète, unJInternalFrame
devrait invoquer exactement le même problème).J'ai beaucoup écrit et j'ai l'impression de pouvoir en écrire plus. Quoi qu'il en soit, j'espère que je ne recevrai pas de vote négatif simplement parce que c'est une opinion impopulaire. La question est clairement valable et j'espère avoir fourni une réponse valable, même si ce n'est pas l'opinion commune.
Microsoft Excel est un excellent exemple de plusieurs cadres / document unique par cadre ( SDI ) par rapport à un seul cadre / plusieurs documents par cadre ( MDI ). Quelques avantages du MDI:
SDI (Single-Document Interface, c'est-à-dire que chaque fenêtre ne peut avoir qu'un seul document):
MDI (Multiple-Document Interface, c'est-à-dire que chaque fenêtre peut avoir plusieurs documents):
la source
JFrame
et un grand parentJTabbedPane
; mais avec la possibilité d'ouvrir une deuxième fenêtre (ou même plus) où la mise en page peut être différente, offrant ainsi un comportement hybride où les amateurs de SDI sont heureux et les MDI aussi. Dans tous les cas, j'ai toujours considéréJInternalFrame
comme un motif horrible qui vous donne tous les inconvénients des deux mondes. La flexibilité qu'ils offrent est tout simplement nulle et ils rongent beaucoup d'espace précieux sur l'écran sans véritable objectif.JFrame
obtient sa propre icône de barre des tâches. Parfois, c'est exactement ce que vous voulez, mais parfois ce n'est pas le cas. Dans WinAPI, c'est facile à configurer, mais dans Swing, il semble que cela ne puisse pas être fait.JDialog
sur unJFrame
.Je voudrais contrer l'argument "pas convivial" avec un exemple avec lequel je viens d'être impliqué.
Dans notre application, nous avons une fenêtre principale où les utilisateurs exécutent différents «programmes» sous forme d'onglets séparés. 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 qui ont été générés par le système, et l'utilisateur peut cliquer sur une icône sur chaque ligne pour ouvrir une boîte de dialogue de visualisation de rapports. Cette visionneuse montre l'équivalent des pages A4 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 rendre ces fenêtres de visualisation de rapports non modales, 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é quand j'ai découvert comment les utilisateurs contournaient cette «déficience» de notre système.
Ils ouvraient une visionneuse, utilisaient la fonction `` Enregistrer sous '' pour enregistrer le rapport au format PDF dans un répertoire spécifique, utilisaient Acrobat Reader pour ouvrir le fichier PDF, puis ils feraient de même avec le prochain rapport. Ils disposeraient de plusieurs lecteurs Acrobat fonctionnant avec les différentes sorties de rapport qu'ils souhaitaient consulter.
J'ai donc cédé et rendu le spectateur sans modèle. Cela signifie que chaque visionneuse a une icône de barre des tâches.
Lorsque la dernière version leur a été publiée la semaine dernière, la réponse écrasante de leur part est qu'ils l'adorent. Il s'agit de l'une de nos améliorations les plus récentes apportées au système.
Vous allez donc de l'avant et dites à vos utilisateurs que ce qu'ils veulent est mauvais, mais en fin de compte, cela ne vous rendra aucun service.
QUELQUES NOTES:
ModalityType
plutôt que l'modal
argument booléen . C'est ce qui donne à ces boîtes de dialogue l'icône de la barre des tâches.la source
Faites un jInternalFrame dans le cadre principal et rendez-le invisible. Ensuite, vous pouvez l'utiliser pour d'autres événements.
la source
Cela fait un moment depuis la dernière fois que j'ai touché le swing mais en général c'est une mauvaise pratique de le faire. Certains des principaux inconvénients qui viennent à l'esprit:
C'est plus cher: vous devrez allouer bien plus de ressources pour dessiner un JFrame qu'un autre type de conteneur de fenêtre, comme Dialog ou JInternalFrame.
Pas convivial: il n'est pas facile de naviguer dans un tas 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 retorique , maintenant c'est beaucoup plus facile et d'autres personnes plus intelligentes (ou avec plus de temps libre) que nous l'avons déjà pensé à travers le modèle Desktop et JInternalFrame, donc je recommanderais de l'utiliser.
la source
JInternalFrame
aussi? Personnellement, je suis en désaccord avec l'utilisation deJInternalFrame
!CardLayout
est une vraie bénédiction!JInternalFrame
ne présente aucun avantage dans l' un des trois cas que vous avez mentionnés (1. où est la preuve quiJInternalFrame
est plus léger queJFrame
? 2. VotreJInternalFrame
s pourrait être tout aussi encombrées / désordre / coincé ensemble comme un groupe deJFrame
s. 3. Comment estJInternalFrame
plus facile? C'est la même code exact, sauf qu'un est contenu dans unJDesktopPane
et un est contenu dans la zone de l'écran naturel. Ils me semblent tout aussi complexes.)JComponent
s, les deux ont des structures presque identiques, sauf que l'un est rendu sur unJDesktop
et l'autre ne l'est pas. Encore une fois, désolé, mais je crois que vous spéculez sur le "poids" deJFrame
. 2. Mes applications utilisent SDI et mes clients sont très satisfaits. Cependant, vous avez dit "une tonne de fenêtres", ce qui, bien sûr, serait nul. Mais, mon point est le suivant: "une tonne de"JInternalFrame
serait nul aussi mauvais! Si vous dites que les JIF vous permettent d'être un concepteur d'interface bâclé, c'est terrible. Un désordre encombré est un désordre encombré, qu'il soit JF ou JIF.Une mauvaise pratique sans aucun doute. L'une des raisons est qu'elle n'est pas très «conviviale» car chaque
JFrame
affiche une nouvelle icône de barre des tâches. Contrôler plusieursJFrame
s vous fera arracher vos cheveux.Personnellement, j'utiliserais ONE
JFrame
pour votre type d'application. Les méthodes d'affichage de plusieurs choses dépendent de vous, il y en a beaucoup.Canvas
es,JInternalFrame
,CardLayout
, mêmeJPanel
s peut - être.Plusieurs objets JFrame = douleur, problème et problèmes.
la source
Je pense que l'utilisation de plusieurs
Jframe
s n'est pas une bonne idée.Au lieu de cela, nous pouvons utiliser
JPanel
s plus d'un ou plusieursJPanel
dans le mêmeJFrame
.Nous pouvons également basculer entre ce
JPanel
s. Cela nous donne donc la liberté d'afficher plus que sur chose dans leJFrame
.Pour chacun,
JPanel
nous pouvons concevoir différentes choses et tout celaJPanel
peut être affiché sur la seuleJFrame
à la fois.Pour basculer entre cette
JPanel
utilisationJMenuBar
avecJMenuItems
pour chacunJPanel
ou «JButtonfor each
JPanel».Plus d'un
JFrame
n'est pas une bonne pratique, mais il n'y a rien de mal si nous en voulons plus d'unJFrame
.Mais il vaut mieux en changer un
JFrame
pour nos différents besoins plutôt que d'avoir plusieursJFrame
s.la source
Si les cadres vont avoir la même taille, pourquoi ne pas créer le cadre et le passer ensuite comme référence à lui à la place.
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?
la source
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 motifs singleton dans la plupart de mes projets, c'est bien.
la source