2014-05-02 30 views
1

我发现下面的example codeAWT对话框放置

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)文档建议这些坐标也在父母的坐标空间中。

当然,对话框的父母是面板,所以在我看来,上面的代码是不正确的,并且当试图居中对话框时,它不应该将pl.x/pl.y添加到坐标。但是,实际上对话框正确居中为

缺少什么我在这里?

(这个问题的背景是,我保持一个窗口管理器,并从Java应用程序对话常常放错了地方。这表明我的代码是错误的,我试图找出为什么/哪里)

+0

查找实现一些更近的​​例子。认真。 AWT在Java 1.2中被Swing有效地取代。由于在1.4中引入了setLocationRelativeTo(null)',所以查找宽度和高度的组件的中心点已经不必要了。但定位框架的最佳方法是在Java 1.6中引入'setLocationByPlatform(true)'。 –

回答

1

owner是对话框的父项,而不是在于Dialog是面板的父项,但是在一个窗口拥有另一个窗口的意义上为模态。

Frame#getLocation将返回屏幕上的帧的位置。 pdowner的(Frame S)的尺寸和dd是对话框的大小...

当然,整个事情可以通过使用Dialog#setLocationRelativeTo和传递owner的参考方法

+0

感谢您的回复 - 尽管如此,它并不完全回答我的问题。将pl.x和pl.y添加到传递给'd.setLocation'的坐标表明这些坐标相对于屏幕。然而,'setLocation'的文档表明它们是相对于对话框的父对象的,它不是屏幕而是所有者面板。这似乎是一个矛盾,我不知道如何解决。 –

+0

否,'pl.x'和'pl.y'将与对话框的内容窗格相关,该窗格可能为0x0,因为面板将被放置在“CENTER”位置,但占据大部分空间(不包括'p2'占用的空间) – MadProgrammer

+0

我刚刚检查过,'pl.x'和'pl.y'肯定是相对于屏幕的左上角。 –

相关问题