如何在屏幕上居中java.awt.FileDialog

时间:2010-03-18 02:11:35

标签: java awt filedialog

我从未能想到这个;通常的嫌疑人不起作用。

假设:

FileDialog                  dlg=null;

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

有没有办法让对话框居中?

关键点在于setVisible(),调用线程被阻塞,直到对话框被解除;之前的任何定位似乎都被忽略了。

4 个答案:

答案 0 :(得分:7)

以下解决方案适用于SWT,可能它也可以为AWT提供技巧......

当它显示当前shell左上角的对话框时,一个快速而肮脏的解决方案是创建一个新的,定位良好且不可见的shell并从中打开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上我没有测试) - 第一次对话框显示相对于父shell(这是我们需要的)居中,并“记住”它在屏幕上的绝对位置。通过后续调用,它总是弹出在同一个地方,即使主应用程序窗口移动了。

尽管有些奇怪,但从我的角度来看,新行为肯定比对话框的默认非专业左右对接更好。

答案 1 :(得分:1)

似乎这可能仍然是一个错误....见最后一行(虽然它的日期为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]

但屏幕仍在左上角

答案 2 :(得分:0)

试试这段代码:dlg.setLocationRelativeTo(null);

答案 3 :(得分:0)

使用Java 7,Eclipse 4.4.1和Ubuntu 14.04,我找到了一个以AWT FileDialog为中心的解决方案。

我决心找到一个解决方案,因为Apple recommends使用awt.FileDialog而不是Swing的JFileChooser来获得更原生的外观。

诀窍是在设置FileDialog之前为size个实例location提供。{/ p>

使用主应用bounds contentPane的{​​{1}}来计算frame左角Point(minX,minY)的距离来自FileDialog的中心contentPane

然后将Point的{​​{1}}设置为此计算的location,等等。中心。

FileDialog