La solution ci-dessous fonctionne pour SWT, sans doute, il peut faire l'affaire pour AWT ainsi ...
Comme il montre la boîte de dialogue dans le coin supérieur gauche du shell actuel, une solution rapide et sale est de créer un nouveau shell, bien positionné et invisible et d'en ouvrir FileDialog. Je suis un résultat acceptable avec le code suivant:
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;
}
}
La classe peut être utilisé de cette façon:
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();
}
La classe ne résout en partie le problème de la plate-forme Windows (sur MacOS la boîte de dialogue est écran- centré de toute façon, sur Linux je n'ai pas testé) - la première fois le dialogue apparaît centré relativement au shell parent (ce dont nous avons besoin), et "se souvient" de sa position absolue sur l'écran. Par les appels suivants, il apparaît toujours au même endroit, même si la fenêtre principale de l'application a été déplacée.
Malgré l'étrangeté, de mon point de vue, le nouveau comportement est définitivement meilleur que l'ancrage gauche gauche de la boîte de dialogue.
C'est ce que j'ai vu. –
Ce lien de bogue n'est pas correct, puisque le rapporteur a placé setLocationRealativeTo après setVisible, donc ce n'était pas considéré comme un bogue. Peut-être un autre lien pointe vers le bon bug, avec la setVisible comme dernière action .. Je cherche .. –
A setVisible(), le thread appelant est bloqué jusqu'à ce que la boîte de dialogue soit fermée; il semble que setVisible() repositionne en quelque sorte le dialogue. –