记录学习过程中经历的点点滴滴,只为以后不犯重复的错误。
好多次做完GUI界面时,发现一个很有趣的问题,要先调整窗口大小才会显示出组件,而不是立马显示出组件,于是乎google,才发现是在组件还未添加到面板前就将窗口(JFrame)设为可见(setVisible()),控件并不会引发重绘。解决方法很简单,只需要等所有组件都准备好以后才将JFrame的setVisible()设置为true。亦或是你很倔,非要在调用setVisible()之后添加组件,那么你也可以这样做:getContentPane().invalidate();
顺便说另一个遇到的问题,在java.swing的JFrame中添加密码框和文本框组件没有全部显示。理由是JFrame的默认布局是BorderLayout,它会在BorderLayout.center位置以布满整个区域的形式显示最后一个添加上去的组件。不信用getLayout()看看JFrame的布局方式,一切将会真相大白。
本次实验用到的源代码:
public class Xiaozujian extends JFrame {
private JLabel loginl;
private JLabel passwordl;
private JTextField login;
private Container containter;
private JTextArea textarea;
private JPasswordField password;
public Xiaozujian()
{
initFrame();
init();
//login.setText(""+getLayout());
setVisible(true);//将这个方法放在后面,以至于所有组件立马能显示,是关键
}
public void initFrame()
{
setTitle("小组件");
setSize(400,400);
containter=getContentPane();
//setBackground(Color.BLUE);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public void init()
{
loginl=new JLabel("登录名:");
login=new JTextField(10);
containter.add(loginl);
containter.add(login);
passwordl=new JLabel("密码:");
password=new JPasswordField(10);
containter.setLayout(new FlowLayout());//必须设置布局方式,否则不显示
containter.add(passwordl);
containter.add(password);
textarea=new JTextArea(8,20);
containter.add(new JScrollPane(textarea));
password.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e)
{
textarea.append("登录名:"+login.getText()+" "+"密码:"+password.getSelectedText());//getSelectedText()显示选中的
textarea.append("\n");
}
});
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Xiaozujian x=new Xiaozujian ();
}
}
尼玛,文字部分调整了后还是多出一条灰色的区域,灰常不理解,这让处女座的我怎么办