我發現下面的example code:AWT對話框放置
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應用程序對話常常放錯了地方。這表明我的代碼是錯誤的,我試圖找出爲什麼/哪裏)
查找實現一些更近的例子。認真。 AWT在Java 1.2中被Swing有效地取代。由於在1.4中引入了setLocationRelativeTo(null)',所以查找寬度和高度的組件的中心點已經不必要了。但定位框架的最佳方法是在Java 1.6中引入'setLocationByPlatform(true)'。 –