2009-06-02 12 views
52

Gibt es eine Möglichkeit, die Schließen-Schaltfläche ("X") aus der Titelleiste JDialog zu entfernen?Schaltfläche "X" in Swing entfernen JDialog

+7

ich einige Anwendungen, die einen weiteren Dialog zeigen, gesehen haben, wenn Sie auf die Schaltfläche Schließen Sie drücken sagen, stattdessen eine der anderen Tasten zu drücken. Genius! –

Antwort

1

Bei einer Schätzung, stellen Sie es auf PL & F dekoriert und entfernen Sie die Komponente mit Namen.

+1

Was ist PL & F? Vielen Dank. – kenshinji

+0

PL & F ist Pluggable Look & Feel. Der hässliche Weg Swing kann ein beliebiges Look & Feel annehmen. –

+2

Warum hässlich? Was wäre der richtige Weg? –

53

Sie können den gesamten Dialogtitel entfernen, indem Sie dialog.setUndecorated (true) aufrufen. Dies bedeutet jedoch, dass der Dialog nicht mehr verschoben werden kann.

Sie können dialog.setDefaultCloseOperation (WindowConstants.DO_NOTHING_ON_CLOSE) auch ausführen, um zu verhindern, dass die Schaltfläche irgendetwas ausführt.

Abgesehen davon denke ich nicht, dass es eine Möglichkeit gibt, das X vollständig zu entfernen.

13

Ich glaube, dass Sie dialog.setUndecorated(true) aufrufen können, um die Titelleiste zu entfernen. Ich bin mir nicht sicher, ob es nur das "X" ist.

Das Entfernen des 'X' ist jedoch möglicherweise keine gute Idee, da Ihre Benutzer den Dialog einfach schließen können.

Am besten ist es zu kontrollieren, was passiert, wenn die Benutzer auf das 'X' klicken, indem sie dialog.setDefaultCloseOperation oder WindowListener verwenden.

9

Ab Java 1.7 (AKA Dolphin oder Java 7) können Sie die Schließen-Schaltfläche in einem Fenster nicht deaktivieren oder entfernen. Sie können die Maximierungsschaltfläche mit frame.setResizable(false) entfernen/deaktivieren, und Sie können die Schaltflächen zum Minimieren und Maximieren entfernen, indem Sie eine java.awt.Dialog oder eine Klasse verwenden, die sie erweitert, z. B. javax.swing.JDialog. Sie können die Titelleiste, Rahmen und Schaltflächen mit frame.setUndecorated(true) entfernen, und Sie können die volle Kontrolle über die Sichtbarkeit aller Schaltflächen in der Titelleiste (unter Verlust der plattformübergreifenden Kompatibilität und Betriebssystemintegration) mit frame.setDefaultLookAndFeelDecorated(true) (vorausgesetzt, es ist ein JFrame oder JDialog). Das ist die Kontrolle, die ich mit dem aktuellen JDK sehe.

+4

Dies ist "wird nicht behoben" auf [Bugparade] (http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=5085932). –

+0

Dies ist nicht ganz korrekt. Das Subclassing/Instantiieren eines JDialogs unter OS X (getestet mit El Capitan) entfernt keine Schaltflächen aus der Titelleiste, noch irgendeine Kombination von Einstellungen (und ja, ich habe jede Kombination ausprobiert). Nur 'setUndcorated (true)' entfernt sie alle, aber mit ihm geht die Titelleiste. Sie können sicherlich das Verhalten der Titelleiste Schaltflächen ändern, aber wie für das Aussehen ...Es ist eine sehr knifflige Situation, in der ich zu viel Zeit mit unzureichenden Lösungen und nicht portierbarem Code verbracht habe. – EntangledLoops

+0

@EntangledLoops Vielen Dank für Ihren Beitrag! Obwohl es wahr ist, dass JDialog in OS X-Dialogen die Schaltflächen zum Minimieren/Maximieren nicht entfernt, wird die Minimierung deaktiviert. Ich habe keinen Mac auf der Hand, um das zu testen, aber ich bin bereit zu wetten, dass der Maximierungs-Button nur die Größe ändert, und wenn Sie 'dialog.setResizable (false)' setzen, wird der grüne Button ebenfalls deaktiviert! Jedenfalls, wie ich in meiner Antwort gesagt habe, ist es ärgerlich, dass wir nicht die volle Kontrolle darüber haben, aber ich kann mir vorstellen, wie albtraumvoll es für JSE-Entwickler sein könnte, für alle Plattformen zu programmieren. ; 3 – Supuhstar

-3
static public void removeButtons(Component c){ 
    if (c instanceof AbstractButton){ 
     String accn = c.getAccessibleContext().getAccessibleName(); 
     Container p=c.getParent(); 
     //log.debug("remove button %s from %s",accn,p.getClass().getName()); 
     c.getParent().remove(c); 
    } 
    else if (c instanceof Container){ 
     //log.debug("processing components of %s",c.getClass().getName()); 
     Component[] comps = ((Container)c).getComponents(); 
     for(int i = 0; i<comps.length; ++i) 
      removeButtons(comps[i]); 
    } 
} 
+7

das wird alle Knöpfe entfernen, die dem Dialog hinzugefügt wurden, nicht die Knöpfe zum Schließen des Dialogs. –

+0

Dies hat keine Auswirkungen auf Titelleisten-Schaltflächen (OS X). – EntangledLoops

+1

Das ist eigentlich ziemlich lustig und lässt Ihre App in einem urkomisch unbrauchbaren Zustand, wenn Sie _ever_ Tasten x3 verwenden – Supuhstar

4

Hier ist meine Erfahrung:

  • Versuchte setUndecorated(true) mit: Aus der ganzen Dialog unsichtbar.
  • Versucht setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE): Dies hat das Verhalten überhaupt nicht geändert. Mein Dialogfeld wurde noch geschlossen. Das Festlegen der Standardschließoperation auf DO_NOTHING_ON_CLOSE delegiert die Schließoperation an die windowClosing()-Methode eines registrierten WindowListener.

Was für mich gearbeitet wurde:

setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); 
//Remove any existing WindowListeners 
for (WindowListener wl : this.getWindowListeners()) 
     this.removeWindowListener(wl); 
this.addWindowListener(new WindowAdapter() { 
     @Override 
     public void windowClosing(WindowEvent e) { 
       if ("Optional condition") { 
         JOptionPane.showMessageDialog(null, "You cannot close this window"); 
       } 
     } 
}); 
Verwandte Themen