8
votes

Puis-je définir la taille normale de Jframe pendant que c'est maximisé?

Objectif:

J'aimerais avoir un cadre visible dans image.MAXIMized_Both état, mais je veux aussi qu'il ait une taille normale prédéfinie afin que L'utilisateur l'aide-t-on, le cadre redimensionnera à la taille que je veux que ce soit. Et je veux que le cadre apparaisse d'abord optimisé, sans redimension visuelle . Et je veux que le cadre reste maximisé jusqu'à ce que l'utilisateur l'achète de l'un-maximise.

choses que j'ai essayées jusqu'à présent:

1) xxx

évaluation: Le cadre passera à l'état normal (ne restera pas maximisé) = > pas bon.

2) xxx

évaluation: la fenêtre (ou juste sa Le cadre) apparaîtra avec une taille de 500x500, et après cela, un redimensionnement visuel (au maximum) sera visible => pas bon. La raison en est que si un cadre n'est pas visible, appeler SetextenseTate () sera différé jusqu'à ce que le cadre soit visible.

3) < / p> xxx

évaluation: comme dans la tentative n ° 2, le cadre aura un redimension visuel => non bon.

< fort> 4) J'ai essayé d'ajouter un auditeur de composant à la trame de remplacement composition () et de modifier l'état là-bas. J'ai également essayé d'ajouter un auditeur d'état de fenêtre remplacer windowstatechange () . J'ai aussi essayé d'ajouter un auditeur de fenêtre remplacer fenêtres () .

évaluation: tous ont abouti à une résolution visuelle comme en tentative # 2 = > Pas bien.

Alors, que puis-je faire si je veux que mon cadre ait une taille normale prédéfinie, mais je veux que cela semble optimisé?

Modifier: édité toute la question à être plus clair et ajouté des codes d'exemple (CSCCE).


4 commentaires

Aucune idée sans poster un SSCCE, btw jframe.pack () faire de même


@mkorbel Calling Pack () donne la même chose: je verrai une fenêtre visuelle redimensionner laquelle je veux éviter.


Avez-vous essayé d'essayer de laisser dormir l'EDT pendant une courte période et d'appeler directement votre redîne? peut ne pas fonctionner cependant, mais peut-être sa peine d'essayer. Les solutions laidons résolvent parfois des problèmes laids;)


Le problème @zhedar est que je veux que le cadre reste maximisé. Chaque fois que j'appelle un setsize (), le cadre passe automatiquement à l'état normal de l'état MaxImized_Both.


5 Réponses :


2
votes

Pour moi, l'ordre suivant fonctionne

setSize(100,100);
setExtendedState(JFrame.MAXIMIZED_BOTH);
setVisible(true);


2 commentaires

Il a dit qu'il a un visible jframe. le vôtre n'est pas.


J'ai écrit dans la question que j'ai essayé cela et que cela faisait de cette façon la fenêtre (ou peut-être que son cadre) apparaîtra dans la taille que vous définissez (100x100 dans votre exemple), puis il sera maximisé. Ceci est un redimensionnement visuel que je veux éviter.



3
votes

Je ne suis pas sûr de ce que vous voulez dire, alors j'ai fait un exemple pour démontrer ce que je pense que vous voulez.

crée fondamentalement un jframe avec SetextenseState (jframe.maximized_both) et après 5000milisecondes, il change d'état sur jframe.normal sans scintillement. xxx


7 commentaires

Je veux que le cadre reste dans l'état Maximized_both. Je modifie la question de sorte que les choses seront plus claires.


"Je veux que le cadre reste dans l'état Maximized_both." Je suppose que vous voulez supprimer le minuteur utilisé pour démontrer la taille normale du cadre? Laissez cette partie.


Si je quitte cette partie, votre solution proposée est déjà répertoriée dans mes tentatives. Il a un problème que je vais voir un redimensionnement visuel que je veux éviter.


@icza après avoir lu vos commentaires, etc. Je pense que je comprends bien. Un gros problème mais dans votre exemple de code est définitivement non recommandé. Je ne suis pas par mon PC mais aussi loin que je l'obtiens, vous voulez définir le JFRAME maximisé sur la création sans scintillement visuel? Comme Andrewthompson, dit simplement enlever la minuterie. Si cela donne toujours un redimensionnement visuel que moi, il pense qu'il est possible de s'arrêter. Mais je vais confirmer quand, près de mon PC


Oui, je veux que le jframe a été maximisé sur la création, mais je souhaite aussi que la fenêtre ait redimensionné à une taille spécifiée lorsque l'utilisateur l'aide manuellement manuellement. Si je laissais sortir le setsize (), cela ne se produit pas.


Parce que la définition n'est pas persistante. Vous devez remplacer GetPreFerredSize () ou GetMinimalSize (). De plus, je ne recommanderais pas de définir des problèmes mentionnés ci-dessus que vous devriez appeler Pack () sur JFRAME NON SETSIZE.


@icza im devant mon PC. J'ai supprimé nouvelle minuterie (...); et tous les travaux parfaits lorsque JFRAME est créé, il est maximisé et je ne vois aucun redimensionnement visible. S'il vous plaît poster le SSCCE pour afficher des problèmes spécifiques.



0
votes
this.addWindowStateListener(new WindowStateListener() {

        @Override
        public void windowStateChanged(WindowEvent e) {
                if (e.getNewState() == Frame.NORMAL) {
                    if (getSize().width == 0 || getSize().height == 0) {
                        setSize(500, 500);
                    }
                }
        }
    });

6 commentaires

Le problème avec c'est que je commence par un cadre maximisé. Et quand je l'a-le-optimiser, votre auditeur sera appelé, mais getize () retournera une taille à la fois de largeur et de hauteur supérieure à 0 donc setsize () ne sera pas être appelé.


Vous pouvez le tester. À ce moment-là, vous invoquez GETISISE (), et il retournera (0, 0). Parce que vous appelez image.setextensedstate (cadre.maximized_both) et n'invoque pas setsize (). Donc, la taille de l'image est (0,0).


Je l'ai testé. Et getiser () m'a renvoyé un dimension avec quelque chose près de ma résolution de l'écran.


Vous avez déjà invoqué SetSize ()?


Non, je n'ai pas fait. Je viens d'appeler sextextenseState (maximisé_both) et SETVisible (true) .


Ok, c'est étrange. Dans mon PC, c'est bon, et la méthode getize () retour (0,0).



1
votes

Vous avez été proche de répondre à votre tentative # 2 . Il y a la méthode SetMaxImizedbounds () dans jframe classe. Il est utilisé par image sur Maximized_both EXTENDIETE SET pour afficher le cadre de la taille du béton sans scintiller. Ce qui fonctionne pour moi: xxx

calculatemaximisébounds () calcule les limites maximales (merci, ko!) Pour le cadre, en fonction de l'emplacement et de la taille actuelle - est-ce important si Vous avez plus de 2 moniteurs, surtout s'ils ont des dimensions différentes.


5 commentaires

Je reçois le même résultat si j'include si j'inclus le SetMaximizedbounds () ou non (sauf que lorsque j'inclus SetMaxIMizedbounds () La taille maximale sera évidemment celle que j'ai définie).


Voulez-vous dire que ce cadre continue de scintiller?


Oui, le même que sans SetMaxImizedbounds () . Bien que # 2 est le plus proche de ce que je veux, et ce n'est même pas dérangeant ... mais je ne savais pas à propos de SetMaximizedbounds () alors merci.


Un autre ps: le cadre ne doit pas être visible avant que cadre.setVisible (true) appelé


Oui, c'est le cas.



0
votes

Le code ci-dessous fonctionne pour moi. J'ai utilisé une idée des perzeurs d'un auditeur de fenêtres, mais je vérifie si l'état de la fenêtre a été modifié de maximisé, mais non minimisé (Ainsi, après la restauration du programme, l'état précédent est récupéré):

    setExtendedState(JFrame.MAXIMIZED_BOTH);
    this.addWindowStateListener(new WindowStateListener() {
        @Override
        public void windowStateChanged(WindowEvent e) {
                // In Windows10 state 7 is returned if you minimize, usually ICONIFIED should mean the window is minimized, I used JDK1.6 on W10 (don't ask why)..
                if (e.getNewState() != JFrame.MAXIMIZED_BOTH && e.getNewState() != 7 && e.getNewState() != JFrame.ICONIFIED) {  
                    setSize(768, 500);
                }
        }
    });
    setVisible(true);


0 commentaires