AWT对话框放置

时间:2014-05-02 09:43:05

标签: java linux awt

我找到了以下example code

import java.awt.*;
import java.awt.event.*;

public class DialogExample {
    private static final int WIDTH = 300;
    private static final int HEIGHT = 250;

    public static void main(String[] args) {
    new DialogExample();
    }

    public DialogExample() {
    final Frame f = new Frame();
    f.setTitle("Dialog Example");
    f.setSize(WIDTH, HEIGHT);

    Panel p1 = new Panel() {
        public void paint(Graphics g) {
        int left = DialogExample.WIDTH/2 - 45; // don't use WIDTH shadowed by Panel class
        int top = DialogExample.HEIGHT/2 - 20; // same as above
        g.drawString("Dialog Example", left, top);
        }
    };
    f.add("Center", p1);

    Panel p2 = new Panel();
    f.add("South", p2);

    Button b = new Button("Show Dialog");
    b.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
        showDialog(f);
        }
    });
    p2.add(b);

    // close window on X
    f.addWindowListener(new WindowAdapter(){
        public void windowClosing(WindowEvent e){ 
        System.exit(0);
        }
    });

    f.setVisible(true);
    }

    private void showDialog(Frame owner) {
    final Dialog d = new Dialog(owner, "The Dialog", true); // true for modal
    d.add("Center", new Label("Hi, how are you?"));
    Button ok = new Button("OK");
    ok.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
        d.setVisible(false);
        }
    });
    d.add("South", ok);
    d.pack();

    // locate dialog to the center
    Dimension dd = d.getSize();
    Dimension pd = owner.getSize();
    Point pl = owner.getLocation();
    d.setLocation(
        pl.x + ((int) (pd.getWidth() - dd.getWidth()))/2,
        pl.y + ((int) (pd.getHeight() - dd.getHeight()))/2
    );
    d.setVisible(true);
    }
}

我对这部分感到困惑:

    Point pl = owner.getLocation();
    d.setLocation(
        pl.x + ((int) (pd.getWidth() - dd.getWidth()))/2,
        pl.y + ((int) (pd.getHeight() - dd.getHeight()))/2
    );

getLocation()的文档说明这会返回组件的父坐标空间中组件边界的左上角。由于此面板没有父级,因此看起来这意味着相对于屏幕左上角的坐标。同样,setLocation(x, y)文档表明这些坐标在父母的身上。也协调空间。

当然对话框' parent是面板,因此在我看来上面的代码是不正确的,并且在尝试居中此对话框时不应将pl.x / pl.y添加到坐标。但是,实际上对话框 正确居中。

我在这里缺少什么?

(这个问题的背景是我正在维护一个窗口管理器,来自Java应用程序的对话通常是错误的。这表明我的代码是错误的,我试图找出原因/在哪里)

1 个答案:

答案 0 :(得分:1)

owner是对话框的父级,不是Dialog是面板的父级,而是在一个窗口拥有另一个窗口的意义上。

Frame#getLocation将返回屏幕上框架的位置。 pdowner' s Frame s),dd是对话框大小......

当然,使用Dialog#setLocationRelativeTo并将owner的引用传递给方法

可以实现整个过程。