Suppression des boutons minimize, maximize et close d'un JFrame

Signaler
-
Twinuts
Messages postés
5348
Date d'inscription
dimanche 4 mai 2003
Statut
Modérateur
Dernière intervention
30 mars 2020
-
Bonjour,
Je développe sous Netbens 8.0.1, et j'ai un JFrame pour lequel je souhaite faire disparaître les boutons minimize, maximize et close de la barre du JFrame.
Je ne peux pas utiliser l'option Undecorated car je veux pouvoir déplacer le formulaire.
Je pense que je ne peux pas utiliser un JDialog car le bouton close existe encore.
Pouvez-vous m'aider.
Merci

2 réponses

Messages postés
5348
Date d'inscription
dimanche 4 mai 2003
Statut
Modérateur
Dernière intervention
30 mars 2020
93
Salut,

En PURE java et avec la décoration système de la fenêtre ce n'est pas possible.
Par contre il existe un petit workaround pour faire plus ou moins ce que tu veux:
import java.awt.Component;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JPanel;


public class WindowWithoutButtons extends JFrame {
  public WindowWithoutButtons() { 
    setResizable(false); // important pour supprimer les boutons min/max
    clearWindowButtons(this);
    // taille de la fenêtre
    setSize(400,300);
    // centre la fenêtre
    setLocationRelativeTo(null);
    // aucune action sur la fermeture (comme il n'y a plus de boutons....)
    setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);  

    // pour pouvoir fermer la fenêtre
    JPanel p = (JPanel) getContentPane();
    p.setLayout(new FlowLayout());
    JButton bClose = new JButton("Close");
    bClose.addActionListener(new ActionListener(){  
      public void actionPerformed(ActionEvent ae){  
        System.exit(0);  
      }  
    });
    p.add(bClose);
  }
  
  public void clearWindowButtons(Component top) {
    /* supprime le bouton ainsi que le menu qui apparait lors du clic sur la fenetre */
    if(JButton.class.isInstance(top) || JMenu.class.isInstance(top)) {  
      top.getParent().remove(top);  
    }  
    /* parcourt tous les conteneurs de la fenêtre */
    if (Container.class.isInstance(top)) {  
      Component[] comps = ((Container)top).getComponents();  
      for(int x = 0, y = comps.length; x < y; x++)  
        clearWindowButtons(comps[x]);  
    }
  }  
  
  public static void main(String[] args) {
    /* Demande à la JVM de ne pas utiliser les décorations du système */
    /* Doit être fait AVANT l'instance de la fenetre */
    JFrame.setDefaultLookAndFeelDecorated(true);
    WindowWithoutButtons window = new WindowWithoutButtons();
    window.setVisible(true);
    /* par contre les autres fenêtres aussi seront avec cette deco... */
    JFrame other = new JFrame();
    other.setSize(100, 100);
    other.setDefaultCloseOperation(EXIT_ON_CLOSE);
    other.setLocation(window.getX() - 100, window.getY());
    other.setVisible(true);
    /* sauf si tu repasses la déco en mode système */
    JFrame.setDefaultLookAndFeelDecorated(false);
    other = new JFrame();
    other.setSize(100, 100);
    other.setDefaultCloseOperation(EXIT_ON_CLOSE);
    other.setLocation(window.getX() + window.getWidth(), window.getY());
    other.setVisible(true);
    
  }

}


Messages postés
16141
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
30 mars 2020
92
Bonjour,

Regarde les classes mères de JFrame, c'est à dire Frame et Window, ainsi que leur classes filles (Dialog, JWindow) pour refaire ce que fait une JFrame, sauf l'ajout des boutons que tu ne veux pas.