Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Swing on OSX: How to Trap command-Q?

Tags:

After being convinced ("schooled") that Swing apps on Mac do look native, I'm trying to make mine look as native as possible. Everything looks great, but when I hit command+Q or do it from the menu, my windowStateChanged(WindowEvent e) is not firing on my main JFrame (if I exit in any other way, it does fire). How can I respond to the real Apple quit?

like image 577
Dan Rosenstark Avatar asked Jan 13 '10 23:01

Dan Rosenstark


1 Answers

You can implement com.apple.eawt.ApplicationListener and respond to the Quit event. An example may be found in the Mac OS X Reference Library example, OSXAdapter.

Addendum: See Java for Mac OS X 10.6 Update 3 and 10.5 Update 8 Release Notes for information on deprecation, the redesigned com.apple.eawt.Application class, and the location of API documentation for the Apple Java extensions. Control-click or right-click on the .jdk file to Show Package Contents. You can browse the classes of com.apple.eawt among the OpenJDK sources.

As shown in this complete example, you can specify the desired QuitStrategy; a WindowListener will respond to ⌘Q:

Application.getApplication().setQuitStrategy(QuitStrategy.CLOSE_ALL_WINDOWS); 

As noted here, you can set the property from the command line

java -Dapple.eawt.quitStrategy=CLOSE_ALL_WINDOWS -cp build/classes gui.QuitStrategyTest 

or early in the program, before posting any GUI events:

System.setProperty("apple.eawt.quitStrategy", "CLOSE_ALL_WINDOWS"); EventQueue.invokeLater(new QuitStrategyTest()::display); 

image

Console, after ⌘Q:

java.vendor: Oracle Corporation java.version: 1.8.0_60 os.name: Mac OS X os.version: 10.11 apple.eawt.quitStrategy: CLOSE_ALL_WINDOWS java.awt.event.WindowEvent[WINDOW_CLOSING,opposite=null,oldState=0,newState=0] on frame0 

Code:

package gui;  import java.awt.EventQueue; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import javax.swing.JFrame; import javax.swing.JTextArea;  /**  * @see https://stackoverflow.com/a/7457102/230513  */ public class QuitStrategyTest {      private void display() {         JFrame f = new JFrame("QuitStrategyTest");         f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);         f.addWindowListener(new WindowAdapter() {              @Override             public void windowClosing(WindowEvent e) {                 System.out.println(e);             }         });         f.add(new JTextArea(getInfo()));         f.pack();         f.setLocationRelativeTo(null);         f.setVisible(true);     }      private String getInfo() {         String[] props = {             "java.vendor",             "java.version",             "os.name",             "os.version",             "apple.eawt.quitStrategy"         };         StringBuilder sb = new StringBuilder();         for (String prop : props) {             sb.append(prop);             sb.append(": ");             sb.append(System.getProperty(prop));             sb.append(System.getProperty("line.separator"));         }         System.out.print(sb);         return sb.toString();     }      public static void main(String[] args) {         System.setProperty("apple.eawt.quitStrategy", "CLOSE_ALL_WINDOWS");         EventQueue.invokeLater(new QuitStrategyTest()::display);     } } 
like image 155
trashgod Avatar answered Oct 07 '22 16:10

trashgod