Приведенное ниже решение работает для SWT, возможно, оно может также помочь AWT ...
Поскольку оно показывает диалоговое окно в левом верхнем углу текущей оболочки, быстрое и грязное решениесоздать новую, хорошо позиционированную и невидимую оболочку и открыть из нее FileDialog.Я получил приемлемый результат с помощью следующего кода:
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.Dialog;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.Shell;
public class CenteredFileDialog extends Dialog {
protected Shell shell;
public FileDialog dialog;
private int width = 560; // WinXP default
private int height = 420;
public CenteredFileDialog(Shell parent, int style) {
super(parent, style);
shell = new Shell(getParent(), SWT.APPLICATION_MODAL);
dialog = new FileDialog(shell, style);
}
public Object open() {
shell.setSize(width, height);
Rectangle parentBounds = getParent().getBounds();
shell.setLocation(
parentBounds.x + (parentBounds.width - width) / 2,
parentBounds.y + (parentBounds.height - height) / 2);
Object result = dialog.open();
shell.dispose();
return result;
}
}
Этот класс можно использовать следующим образом:
CenteredFileDialog saveDialog = new CenteredFileDialog(getShell(), SWT.SAVE);
saveDialog.dialog.setFilterExtensions(new String[] { "*.txt" });
saveDialog.dialog.setFilterNames(new String[] { "Text (*.txt)" });
...
String f = (String)saveDialog.open();
if ( f != null ) {
name = f;
recentPath = saveDialog.dialog.getFilterPath();
}
Класс только частично решает проблему для платформы Windows (на MacOSдиалог в любом случае центрирован по экрану; в Linux я не тестировал) - впервые диалог появляется по центру относительно родительской оболочки (что нам и нужно) и «запоминает» его абсолютную позицию на экране.При последующих вызовах он всегда всплывает в одном и том же месте, даже если главное окно приложения перемещено.
Несмотря на странность, с моей точки зрения, новое поведение определенно лучше, чем непрофессионально выглядящая по умолчанию верхняя левая стыковка диалога.