現在、このコードを使用して 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);
}
}
以前は Java 6 を使用してアプリケーションをコンパイルし、clientProperty を設定すると、apple.awt.documentModalSheet
OSX でダイアログを「シート」として表示するのに完全に機能していましたが、Java 7 (更新 25) の使用を開始し、ダイアログがシートとして表示されなくなりました。これに関する更新ドキュメントが見つからないようです。彼らはこれについて何か変更しましたか? どうすればこれを解決できますか? 現在のインターフェイス デザインは、ダイアログよりもシートの方が見栄えがします。
アップデート
私が経験しているのと同じ問題と思われる次のバグ レポートを見つけました。
http://bugs.sun.com/view_bug.do?bug_id=8010197
これを解決する方法を知っている人はいますか?QuaQuaなどのライブラリを調べましたが、シート機能が必要なだけなので、ライブラリを使用しないことをお勧めします。
更新 2
QuaQua を試してみましたが、Java 7 でコンパイルすると、現在ライブラリにまったく同じ問題があります。回避策はありますか?
アップデート 3
コードを実際のサンプルに置き換えました ( http://pastebin.com/PJ8VGdPb )
更新 4
SWT には SWT.SHEET という名前のシェル クラスのスタイルがあり、Java7 でも動作することがわかりました。SWT のようなライブラリを使用することは好みませんが、それが唯一の解決策のようです。