java中GUI出现的问题及解决方法

   记录学习过程中经历的点点滴滴,只为以后不犯重复的错误。
   好多次做完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 ();
	}

}

尼玛,文字部分调整了后还是多出一条灰色的区域,灰常不理解,这让处女座的我怎么办

  

你可能感兴趣的:(JAVA)