Showing JDialog as sheet not working

java, jdialog, macos, swing

Solution

As far as I know, Apple didn't officially released their version of JDK 7. The latest version of the JDK Apple has optimized for their OS X is still JDK 6. That is also why updates for Java come thru the AppStore update tab. These updates do not come straight from Oracle.

If you downloaded JDK 7 directly from Oracle, this is a more generic, non-tweaked version.

So, I think you will just have to wait for Apple to release their OS X optimized JDK 7.

I experienced a lot of OS X features not to be working when I download from Oracle:

- Trackpad gestures

- Native Aqua Look'n'Feel doesn't work, even when trying to set it manually through UIManager.

- Application icon not working when using JOptionPane.

- JMenu's will stick into the JFrame itself instead of moving to the top of the screen.

Problem

I am currently using this code to create a JDialog; ``` package com.kamuara.reposync.window; import java.awt.Dialog; import java.awt.Font; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.UIManager; public class SheetDialog { private JFrame _windowFrame; public static void main(String[] args) { System.setProperty("apple.awt.documentModalSheet", "true"); System.setProperty("apple.awt.brushMetalLook", "true"); try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); new SheetDialog(); } catch (Exception e) { e.printStackTrace(); } } public SheetDialog() { _windowFrame = new JFrame(); _windowFrame.setResizable(false); _windowFrame.setBounds(100, 100, 451, 320); _windowFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); _windowFrame.getContentPane().setLayout(null); _windowFrame.setVisible(true); JButton showDialogButton = new JButton("Show Dialog"); showDialogButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { showSheetDialog(_windowFrame, "Test", "This should be a sheet dialog", "Oke"); } }); showDialogButton.setBounds(328, 263, 117, 29); _windowFrame.getContentPane().add(showDialogButton); } public void showSheetDialog(JFrame owner, String title, String message, String button) { final JDialog messageDialog = new JDialog(owner, title, Dialog.ModalityType.DOCUMENT_MODAL); messageDialog.setBounds(30, 0, owner.getWidth() - 60, 130); // TODO: only when os is osx messageDialog.getRootPane().putClientProperty("apple.awt.documentModalSheet", "true"); messageDialog.setLayout(null); int offsetX = 25; JLabel titleLabel = new JLabel(title); titleLabel.setFont(new Font("Lucida Grande", Font.BOLD, 13)); titleLabel.setBounds(offsetX, 10, 100, 25); messageDialog.getContentPane().add(titleLabel); JLabel messageLabel = new JLabel(message); messageLabel.setVerticalTextPosition(JLabel.TOP); messageLabel.setHorizontalTextPosition(JLabel.LEFT); messageLabel.setFont(new Font("Lucida Grande", Font.PLAIN, 11)); messageLabel.setBounds(offsetX, 10, messageDialog.getWidth() - 10, messageDialog.getHeight() - 60); messageDialog.getContentPane().add(messageLabel); JButton okButton = new JButton(button); okButton.setBounds(messageDialog.getWidth() - 105, messageDialog.getHeight() - 35, 100, 25); okButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent arg0) { messageDialog.dispose(); } }); messageDialog.getContentPane().add(okButton); messageDialog.setVisible(true); } } ``` I was previously using Java 6 to compile the application and setting the clientProperty `apple.awt.documentModalSheet` was working perfectly to display the dialog as a "Sheet" on OSX but now I started using Java 7 (update 25) and the dialog is no longer displayed as a Sheet. I can't seem to find any update documentation on this. Have they changed anything about this? How can I solve this? The current interface design looks tons better with a Sheet than a dialog. Update I found the following Bug report which seems to be the same issue as I am experiencing; https://bugs.java.com/bugdatabase/view_bug?bug_id=8010197 Does anyone know how to resolve this? I have looked into libraries like QuaQua but I would prefer not using any library because I just want the Sheet functionality. Update 2 I tried QuaQua, but the library currently has the exact same problem when compiling with Java 7. Any workarounds? Update 3 Replaced code with working sample (http://pastebin.com/PJ8VGdPb) Update 4 Found out SWT has a style for their Shell class named SWT.SHEET which still works in Java7, I don't prefer using a library like SWT, but it seems to be the only solution.

Original source

Related problems