null layout不是很好,所有的東西都要自己定義,壹旦窗口大小變化就要重新計算。我建議使用MigLayout。上手慢,但很強大。
而且,就算妳要用內建的Layout Manager,還有壹個GridBag Layout,比Grid Layout更強大壹點。
接下來,那個邊框,不是JSeparator, 而是壹個邊框。我猜是
Border result = BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(EtchedBorder.LOWERED), "修改信息: ");
如果是我,使用MigLayout,以上代碼還是比較簡單的:
import?java.awt.event.KeyEvent;import?javax.swing.BorderFactory;
import?javax.swing.JButton;
import?javax.swing.JFrame;
import?javax.swing.JLabel;
import?javax.swing.JPanel;
import?javax.swing.JTextField;
import?javax.swing.SwingUtilities;
import?javax.swing.border.Border;
import?javax.swing.border.EtchedBorder;
import?net.miginfocom.swing.MigLayout;
public?class?MyFrame?extends?JFrame?{
public?MyFrame()?{
begin();
}
private?void?begin()?{
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(new?MigLayout("insets?10,?fill",?"[]",?"[]5[]"));
//first?panel
JPanel?first?=?new?JPanel();
//first這個panel有5像素的邊緣,2列,3行。第壹列右對齊,占40%寬度;第二列默認,左對齊,占據剩余所有空間。
first.setLayout(new?MigLayout("insets?5,?fill",?"[right,?40%]5[fill,?grow]",?"[]5[]5[]"));
first.setOpaque(false);
//這個面板的border有些特殊:createTitledBorder()方法的簽名可以有兩個:前壹個是線的類型,後面壹個是標題文本。
Border?result?=?BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(EtchedBorder.LOWERED),?"修改信息:?");
first.setBorder(result);
//把first加到contentPane裏面
add(first,?"cell?0?0,?grow");
JLabel?original?=?new?JLabel("輸入原密碼:?");
JLabel?newPass?=?new?JLabel("輸入新密碼:?");
JLabel?confirm?=?new?JLabel("確認新密碼:?");
JTextField?orig_field?=?new?JTextField();
JTextField?new_field?=?new?JTextField();
JTextField?confirm_field?=?new?JTextField();
//miglayout的核心就是網格排布。用坐標來定義添加元素的位置
first.add(original,?"cell?0?0,?w?100!");?//add?to?col?0,?line?0,?min:pref:max?width?all?set?to?100
first.add(newPass,?"cell?0?1,?w?100!");//add?to?col?0,?line?1
first.add(confirm,?"cell?0?2,?w?100!");//add?to?col?0,?line?2
first.add(orig_field,?"cell?1?0,?w?150!");//add?to?col?1,?line?0,?min:pref:max?width?all?set?to?150
first.add(new_field,?"cell?1?1,?w?150!");//add?to?col?1,?line?1
first.add(confirm_field,?"cell?1?2,?w?150!");//add?to?col?1,?line?2
//按鈕面板
JPanel?buttons?=?new?JPanel();
buttons.setOpaque(false);
//邊緣為5像素;有兩列,中間是10像素的間距,列內元素居中;有壹行,行中上下對齊也是居中
buttons.setLayout(new?MigLayout("insets?5,?fill",?"[center]10[center]",?"[center]"));
JButton?yes?=?new?JButton("Y.?確定");
//快捷鍵設為虛擬鍵Y,得到下劃線效果
yes.setMnemonic(KeyEvent.VK_Y);
JButton?quit?=?new?JButton("Q.?退出");
//快捷鍵設為虛擬鍵Q,得到下劃線效果
quit.setMnemonic(KeyEvent.VK_Q);
//把yes按鈕加到第壹列第壹行,min:pref:max的大小都設為100像素
buttons.add(yes,?"cell?0?0,?w?100!");
//把quit按鈕加到第二列第壹行,min:pref:max的大小都設為100像素
buttons.add(quit,?"cell?1?0,?w?100!");
//把按鈕面板加到contentPane裏面
add(buttons,?"cell?0?1,?grow");
pack();
setBounds(0,?0,?500,?400);
setLocationRelativeTo(null);
setVisible(true);
}
public?static?void?main(String[]?args)?{
SwingUtilities.invokeLater(new?Runnable()?{
@Override
public?void?run()?{
MyFrame?frame?=?new?MyFrame();
}
});
}
}
效果是這樣:
MigLayout還允許妳使用輔助線來debug。把這壹行:
first.setLayout(new?MigLayout("insets?5,?fill",?"[right,?40%]5[fill,?grow]",?"[]5[]5[]"));改成:
first.setLayout(new?MigLayout("insets?5,?fill,debug",?"[right,?40%]5[fill,?grow]",?"[]5[]5[]"));妳就可以看到first面板裏面的輔助線了。