swing窗口居中



使您的 Java 程序看起来更加专业的一种方法就是使其对话框窗口(例如,一个 “about” 窗口)位于父窗口的中间。 可以使用 DE>java.awt.WindowDE> 的 DE>public void setLocationRelativeTo(Component c)DE> 方法完成此任务,该方法将相对于组件参数 —DE>nullDE> 来创建一个居于屏幕中间的窗口。 请看列表 2。

列表 2 AboutBox1.java

DE>// AboutBox1.java

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

import javax.swing.*;
import javax.swing.border.*;

public class AboutBox1
{
public static void main (String [] args)
{
final JFrame frame = new JFrame (“AboutBox1″);
frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);

JPanel panel = new JPanel ()
{
{
JButton btnWindow = new JButton (“Window center”);
ActionListener l = new ActionListener ()
{
public void actionPerformed (ActionEvent e)
{
new AboutBox (frame, “W”).setVisible (true);
}
};
btnWindow.addActionListener (l);
add (btnWindow);


JButton btnScreen = new JButton (“Screen center”);
l = new ActionListener ()
{
public void actionPerformed (ActionEvent e)
{
new AboutBox (frame, “S”).setVisible (true);
}
};
btnScreen.addActionListener (l);
add (btnScreen);
}
};
frame.getContentPane ().add (panel);

// frame.setLocationRelativeTo (null);
frame.pack ();
// frame.setLocationRelativeTo (null);
frame.setVisible (true);
}
}

class AboutBox extends JDialog
{
AboutBox (JFrame frame, String centerMode)
{
super (frame, “AboutBox”, true /* modal */);

final JButton btnOk = new JButton (“Ok”);
btnOk.addActionListener (new ActionListener ()
{
public void actionPerformed (ActionEvent e)
{
dispose ();
}
});
getContentPane ().add (new JPanel () {{ add (btnOk); }});

pack ();

setLocationRelativeTo (centerMode.equals (“W”) ? frame : null);
}
}DE>
Listing 2′s DE>AboutBox1DE> 创建了一个 GUI,它的两个按钮建立了一个 “about” 对话框,该对话框通过 DE>setLocationRelativeTo()DE> 方法位于应用程序主窗口或屏幕的中心位置。 DE>frame.pack ();DE> 之前被注释掉的一行无法起到使主窗口居中的作用,因为主窗口的大小还没有确定。 但是,被注释掉的第二行起到了使窗口居中的作用。

DE>getContentPane ().add (new JPanel () {{ add (btnOk); }});DE> 也许看起来有点奇怪,因为它嵌套了许多括号。 本质上该语句可以理解为,创建一个内部匿名类(该类扩展自 DE>javax.swing.JPanelDE>)的对象,通过由内层括号对标识的 object block initializer 为此对象添加一个按钮,然后将对象添加到对话框的 content pane 中。