使用多个监视器时设置对话框位置

时间:2012-09-11 15:02:55

标签: java jdialog multiple-monitors

我通常依靠setLocationRelativeTo(null)将对话框放在屏幕中心,但最近我得到了第二个监视器,这个方法总是在主监视器上设置对话框中心,即使主窗口是在第二台显示器上。

我知道这是一件愚蠢的事情,但它让我很烦恼。除了相对于主屏幕设置位置之外的任何解决方案?我没有那样做过。

1 个答案:

答案 0 :(得分:0)

我知道这个问题很老......但对于像我这样的其他疯狂程序员来说:

创建自己的类,扩展JDialog并使用super(Frame,Modal)。

这对我有用:

import java.io.File;
import javax.swing.JDialog;
import javax.swing.JFileChooser;
import javax.swing.JFrame;

public class GFileChooserDialog extends JDialog {

    private JFileChooser fileChooser;   
    private File file;

    public GFileChooserDialog(JFrame relativeTo) {
        super(relativeTo, true); 
        this.setAlwaysOnTop(true);
        this.fileChooser = new JFileChooser();
        this.getContentPane().setSize(450, 300);
        int returnVal = fileChooser.showOpenDialog(this);
        if (returnVal == JFileChooser.APPROVE_OPTION) {
            file = fileChooser.getSelectedFile();            
        } 
    }

    public File getFile() {
        return file;
    }
    public void setFile(File file) {
        this.file = file;
    }   
}

使用Singelton-Pattern作为主框架,您可以像这样调用对话框:

new GFileChooserDialog(Singelton.getInstance());

如果要在屏幕中央完美地显示JDialog,请不要使用setLocationRelativeTo。而是覆盖其绘制方法并设置位置:

@Override
public void paint(Graphics g) {
    super.paint(g);
    Rectangle screen = this.getGraphicsConfiguration().getBounds();
    this.setLocation(
        screen.x + (screen.width - this.getWidth()) / 2,
        screen.y + (screen.height - this.getHeight()) / 2
    );
}