2014-05-02 62 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'肯定是相對於屏幕的左上角。 –

相關問題