我目前正在使用这段代码创建一个 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 的 Shell 类有一个名为 SWT.SHEET 的样式,它在 Java7 中仍然有效,我不喜欢使用像 SWT 这样的库,但它似乎是唯一的解决方案。
最佳答案
据我所知,Apple 没有正式发布他们的 JDK 7 版本。Apple 为他们的 OS X 优化的最新版本的 JDK 仍然是 JDK 6。这也是为什么 Java 更新通过 AppStore更新选项卡。这些更新并非直接来自 Oracle。
如果您直接从 Oracle 下载 JDK 7,这是一个更通用、未调整的版本。
因此,我认为您只需等待 Apple 发布其针对 OS X 优化的 JDK 7。
当我从 Oracle 下载时,我遇到了很多 OS X 功能无法使用的情况:
- 触控板手势
- 原生 Aqua Look'n'Feel 不起作用,即使尝试通过 UIManager 手动设置它也是如此。
- 使用 JOptionPane 时应用程序图标不起作用。
- JMenu 将粘在 JFrame 本身中,而不是移动到屏幕顶部。
关于java - 将 JDialog 显示为工作表不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17844665/