2009-12-21 5 views
3

J'essaie de retirer la barre de déplacement en haut du JFrame. Je voudrais garder les options minimiser et fermer qui apparaissent sur cette barre. Ce que je pensais était de retirer la barre (et les icônes). Ajoutez ensuite les icônes en tant qu'images incorporées, qui implémentent l'actionlistener JFrame. Il serait également nécessaire que cela fonctionne avec JInternalFrames. Toute aide serait grandement appréciée.Comment pourrais-je implémenter une nouvelle fonctionnalité JFrame?

+0

Il peut être judicieux d'extraire la fonctionnalité de déplacement dans une autre question. Cela rend plus facile pour les autres de répondre. Et il sera plus facile pour les autres ayant le même problème de trouver la question. –

Répondre

4

Vous devez prendre du recul et comprendre comment fonctionne Swing. Lorsque vous créez une JFrame, Swing utilise le widget OS pour le cadre. La barre de titre que vous voyez fait partie du composant OS et vous n'avez aucun contrôle direct sur celle-ci avec Swing. Vous pouvez masquer la barre de titre (et la bordure) du cadre en utilisant setUndecorated (false) comme suggéré plus haut. Dans ce cas, vous perdez toutes les fonctionnalités associées à la barre de titre (glisser et accéder à tous les boutons) et la bordure (redimensionnement). Donc, si vous avez besoin de cette fonctionnalité, vous devez tout recréer vous-même.

D'autre part, vous pouvez utiliser:

JFrame.setDefaultLookAndFeelDecorated(true); 
JFrame frame = new JFrame(); 

et Swing construire une barre de titre et Border pour vous et rajouter toutes les fonctionnalités par défaut. Donc, si vous voulez éviter de faire glisser, vous devez maintenant inspecter le JFrame pour tous ses composants pour trouver le composant qui représente la barre de titre. Lorsque vous trouvez ce composant, vous pouvez supprimer les MouseMotionListeners du composant pour éviter de le faire glisser. De cette façon, la barre de titre sera toujours là et les boutons seront actifs, mais le glisser sera désactivé. Je suppose que c'est plus facile l'ajout de toutes les fonctionnalités à un cadre non décoré.

Comme vous l'avez déjà compris, JInternalFrame est un composant complètement écrit en Swing, donc vous avez accès aux composants enfant, ce qui est essentiellement l'approche que je suggère pour le JFrame.

+0

Wow, c'était l'une des réponses les plus complètes que j'ai reçues jusqu'ici! J'apprécie vraiment, laissez-moi essayer et revenir à vous – Jeffrey

1

Pour retirer la barre de titre, utilisez

setUndecorated(true); 

Vous pouvez ensuite ajouter à nouveau des boutons pour agrandir/réduire. La source pour maximiser-bouton pourrait ressembler à quelque chose comme ça (juste pour avoir une idée). Utilisez JFrame.ICONIFIED pour réduire le bouton.

JButton btnMaximize = new JButton("+"); 
btnMaximize.addActionListener(new ActionListener() { 
    @Override 
    public void actionPerformed(ActionEvent e) { 
     if(MainFrame.this.getExtendedState() == JFrame.MAXIMIZED_BOTH) { 
      MainFrame.this.setExtendedState(JFrame.NORMAL); 
     } 
     else { 
      MainFrame.this.setExtendedState(JFrame.MAXIMIZED_BOTH); 
     } 
    } 
}); 
+0

Avez-vous déjà essayé de l'utiliser avec un JInternalFrame? –

+0

setUndecorated ne fonctionne pas pour JInternalFrames (bizarre je pensais qu'ils ont hérité de JFrames) – Jeffrey

+0

Je vais essayer, mais pensez à modifier votre question concernant JInternalFrames. –

-1

Pour JInternalFrames ...

javax.swing.plaf.InternalFrameUI ifu= this.getUI(); 
((javax.swing.plaf.basic.BasicInternalFrameUI)ifu).setNorthPane(null); 
+0

Oui, je viens de trouver que dans un autre forum :) –

+0

pourquoi le downvote? Je suis nouveau à stackoverflow, est-ce une mauvaise forme pour afficher les codes trouvés dans d'autres forums? – Jeffrey

1

Jetez un oeil à cet article - Je pense que c'est à peu près ce dont vous avez besoin pour la partie JFrame.

http://www.stupidjavatricks.com/?p=4

Il est basé sur JDialog, mais il devrait être à peu près la même chose que JFrame. Maximiser/minimiser devrait être à peu près le même que le bouton de fermeture.

Questions connexes