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

EPTA - 11 déc. 2014 à 08:15
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 - 11 déc. 2014 à 11:39
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

Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
11 déc. 2014 à 11:39
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);
    
  }

}


1
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 127
11 déc. 2014 à 08:35
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.
0
Rejoignez-nous