Как центрировать файл java.awt.FileDialog на экране - PullRequest
3 голосов
/ 18 марта 2010

Я никогда не мог понять это; обычные подозреваемые не работают.

Дано:

FileDialog                  dlg=null;

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

есть ли способ сделать этот диалог центрированным?

Ключевым моментом является то, что при setVisible () вызывающий поток блокируется до тех пор, пока диалог не будет закрыт; и любое позиционирование до этого, похоже, игнорируется.

Ответы [ 4 ]

7 голосов
/ 05 ноября 2012

Приведенное ниже решение работает для 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 я не тестировал) - впервые диалог появляется по центру относительно родительской оболочки (что нам и нужно) и «запоминает» его абсолютную позицию на экране.При последующих вызовах он всегда всплывает в одном и том же месте, даже если главное окно приложения перемещено.

Несмотря на странность, с моей точки зрения, новое поведение определенно лучше, чем непрофессионально выглядящая по умолчанию верхняя левая стыковка диалога.

1 голос
/ 18 марта 2010

Похоже, что это все еще может быть ошибка .... см. Последнюю строку этого (хотя он датирован 2003)

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

Я бросил это вместе

        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);

И мой вывод был:

Местоположение диалога: java.awt.Point [x = 0, y = 0]

Местоположение диалога: java.awt.Point [x = 840, y = 525]

Но экран все еще был в верхнем левом углу

0 голосов
/ 18 декабря 2014

Используя Java 7, Eclipse 4.4.1 и Ubuntu 14.04, я смог найти решение для центрирования AWT FileDialog.

Я был полон решимости найти решение, потому что Apple рекомендует с использованием awt.FileDialog вместо JFileChooser Swing для более естественного внешнего вида.

Хитрость заключается в том, чтобы дать вашему FileDialog экземпляру size перед установкой его location.

Используйте bounds contentPane вашего основного приложения frame, чтобы вычислить расстояние левого угла Point (minX, minY) FileDialog от центра contentPane Point.

Затем установите location вашего FileDialog на это вычисленное Point, et voilá ... по центру.

    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 голосов
/ 23 мая 2013

Попробуйте этот код: dlg.setLocationRelativeTo (null);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...