2010-03-18 23 views
3

Je n'ai jamais été capable de comprendre celui-ci; les suspects habituels ne fonctionnent pas.Comment centrer java.awt.FileDialog sur l'écran

Étant donné:

FileDialog     dlg=null; 

dlg=new FileDialog(owner,"Select File to Load",FileDialog.LOAD); 
dlg.setFile(null); 
dlg.setVisible(true); 

est-il possible d'obtenir cette boîte de dialogue centrée?

Un point clé est que sur setVisible(), le thread appelant est bloqué jusqu'à ce que la boîte de dialogue soit fermée; et tout positionnement préalable semble ignoré.

Répondre

1

que cela peut également être encore un bug .... voir la dernière ligne de ce (bien que sa date 2003)

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4333836

J'ai jeté cela ensemble

 FileDialog fd = new FileDialog(f, title, FileDialog.LOAD); 

    Dimension dim = Toolkit.getDefaultToolkit().getScreenSize(); 

    int w = fd.getSize().width; 
    int h = fd.getSize().height; 
    int x = (dim.width-w)/2; 
    int y = (dim.height-h)/2; 

    System.out.println("Dialog location: " + fd.getLocation().toString()); 
    fd.setLocation(x, y); 
    System.out.println("Dialog location: " + fd.getLocation().toString()); 
    fd.setVisible(true); 

Et ma sortie Il y avait:

emplacement de dialogue: java.awt.Point [x = 0, y = 0]

emplacement Dialog: java.awt.Point [x = 840, y = 525]

Mais l'écran était encore dans le coin en haut à gauche

+0

C'est ce que j'ai vu. –

+0

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 .. –

+0

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. –

7

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.

0

Essayez ce code: dlg.setLocationRelativeTo (null);

+1

Essayé cela; le problème étant que sur setVisible(), le thread appelant est bloqué jusqu'à ce que la boîte de dialogue soit fermée; et tout positionnement préalable semble ignoré. –

0

En utilisant Java 7, Eclipse 4.4.1 et Ubuntu 14.04, j'ai été capable de trouver une solution pour le centrage AWT FileDialog.

J'ai été déterminé à trouver une solution parce que Apple recommends en utilisant awt.FileDialog sur JFileChooser de Swing pour un aspect plus natif.

L'astuce consiste à donner à votre instance FileDialog un size avant de définir son location.

Utilisez le bounds du contentPane de votre application principale frame pour calculer la distance du coin gauche Point (minX, minY) de FileDialog du centre de contentPanePoint.

Ensuite, réglez le location de votre FileDialog à ce calculé Point, et voilá ... centré.

final FileDialog fileDialog = new FileDialog(applicationFrame, 
      "Choose a file", FileDialog.LOAD); 

    /* Lots of code to be able to center an awt.FileDialog on screen... */ 
    Rectangle rect = applicationFrame.getContentPane().getBounds(); 

    /* 
    * Making sure FileDialog has a size before setVisible, otherwise 
    * left corner's distance from contentPane center cannot be found. 
    */ 
    fileDialog.pack(); 
    fileDialog.setSize(800, 600); 
    fileDialog.validate(); 

    double width = fileDialog.getBounds().getWidth(); 
    double height = fileDialog.getBounds().getHeight(); 

    double x = rect.getCenterX() - (width/2); 
    double y = rect.getCenterY() - (height/ 2); 

    /* Could be new Point(x, y) */ 
    Point leftCorner = new Point(); 
    leftCorner.setLocation(x, y); 

    fileDialog.setLocation(leftCorner); 

    fileDialog.setVisible(true); 
+0

Ha! C'est drôle je suis tombé sur ce post parce que je travaillais juste sur ce code que vous avez posté @ChrisK. Cela ne fonctionne pas sur mon Mac. J'ai copié votre code de dialogue de chargement pour le code de dialogue de sauvegarde sur lequel je travaille et j'essayais de le centrer sur l'application quand j'ai remarqué que le code de chargement copié pour la boîte de dialogue ouverte était censé être centré sur la fenêtre de l'application déjà, mais ça ne l'est jamais. La boîte de dialogue ouverte est toujours au centre de l'écran et non au centre de la fenêtre de l'application. Il n'a également pas les dimensions 800x600. – hepcat72