Java布局管理器初探

1.Java的GUI资源都包含在awt和swing包里,awt对平台有一定的依耐性,swing是新出来的,

   扩展性更好,不过swing依赖awt包生存。awt有两个核心类:Component和Container类。

   Component指那些可以在屏幕显示的东西,所以Component包含Container,同时还有其他

   的小部件,比如Button,TextField。Container又分为Window和Panel,而Window又可分为

   Fram和Dialog。

2.创建窗口时可以设置一系列的值,比如窗口背景色,初始位置,大小。不过设完值之后要注

   意调用显示方法。Panel不能单独建立,它必须有所依赖,或窗口,或Panel。

   对于部件的布局,Frame默认的为BorderLayout,而Panel为FlowLayout,对于部件的布局

   常用的方法还有GridLayout。对于不需要Java自带的布局管理器的程序,程序需要设置Layout

   的值为null,否则即使代码有对部件的布局,那些代码也会无效,因为这些方法都被Java默认

   的布局管理器给覆盖了。

3.消息处理机制,同其他编程一样需要一个监听器去监听你需要监听的操作,然后的话,Java对

   于我们熟悉的PC部件都会有相应的适配器,我们要做的就是写一个类继承对应的适配器,然后

    重写我们需要的动作即可。

4.Java基础部分到这就学完了,不过由于只是看了些视频,没做练习,没看书,所以对java还不

   是很熟悉,所以接下来的事就 是看书,习题来巩固这门编程了。

练习代码:

import java.awt.Color;
import java.awt.Frame;
import java.awt.Panel;
import java.awt.Toolkit;
import java.util.ArrayList;

import javax.swing.plaf.synth.Region;

import org.omg.CORBA.FREE_MEM;
import org.w3c.dom.css.RGBColor;


public class TestGui {
	public static void main( String agrs[]){
		//Fram
		
		//创建一个窗口,要求中间的Panel正好处于中心,且长宽各为窗口的对应长宽的一半
		//效果和下面的类一样,不过这里是通过多个Panel合成的
		Frame fr = new Frame("JavaFram");
		fr.setResizable(false);
		fr.setSize(800, 600);
		fr.setLayout(null);
		//fr.setBackground(Color.yellow); //这个不能设置,否则就结果就全是该颜色了
		fr.setVisible(true);
		fr.setLocation(300,50);
		new MyPanel(fr, 0, 0, fr.getWidth(), fr.getHeight()/4, Color.blue );
		new MyPanel(fr, 0, fr.getHeight()/4, fr.getWidth()/4, fr.getHeight()/2, Color.blue );
		new MyPanel(fr, 0, 3*fr.getHeight()/4, fr.getWidth(), fr.getHeight()/4, Color.blue );
		new MyPanel(fr,3* fr.getWidth()/4, fr.getHeight()/4, fr.getWidth()/4, fr.getHeight()/2, Color.blue );
		new MyPanel(fr, fr.getWidth()/4, fr.getHeight()/4, fr.getWidth()/2, fr.getHeight()/2, Color.yellow);	
	
		//创建一个窗口,要求中间的Panel正好处于中心,且长宽各为窗口的对应长宽的一半
		new MyFram(Color.blue, Color.yellow);
		
		//创建窗口填充整个屏幕,其中有m8行6列的窗口数,启示窗口的颜色为红色
		new MultiWnd(8, 6, Color.red);
	}
}
class MyPanel extends Panel{
	/**
	 * 
	 */
	private static final long serialVersionUID = -5116728333334131221L;

	MyPanel( Frame f, int x, int y, int cx, int cy, Color c){
		setBounds(x, y, cx, cy);
		setBackground(c);
		setVisible(true);
		f.add(this);
	}
}
class MyFram extends Frame{
	/**
	 * 
	 */
	private static final long serialVersionUID = -5650658819184839541L;

	MyFram(Color f, Color p){
		setTitle("中心带panel的fram");
		setLayout(null);//不加这句,即不设置布局管理器的话就不会显示预期结果
		setResizable(false);
		setSize(800, 600);
		setLocation(300,50);
		setBackground(f);
		setVisible(true);
		
		
		Panel pan1 = new Panel();
		pan1.setBounds(getWidth()/4,getHeight()/4,getWidth()/2,getHeight()/2);
		pan1.setBackground(p);
		add(pan1);
		pan1.setVisible(true);
	}
}
class MultiWnd extends Frame{
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	int sumWidth, sumHeight;
	MultiWnd(int m, int n, Color c){
		setLayout(null);
		sumWidth = Toolkit.getDefaultToolkit().getScreenSize().width;
		sumHeight = Toolkit.getDefaultToolkit().getScreenSize().height;
		
		int width = sumWidth/m;
		int height = sumHeight/n;
		Frame fr = null;
		ArrayList<Color> c1 = new ArrayList<Color>();
		c1.add(Color.red);
		c1.add(Color.black);
		c1.add(Color.blue);
		c1.add(Color.cyan);
		c1.add(Color.yellow);
		c1.add(Color.white);
		c1.add(Color.gray);
		c1.add(Color.green);
		c1.add(Color.magenta);
		c1.add(Color.orange);
		c1.add(Color.pink);
		int n1 = c1.indexOf(c);
		for(int  i=0; i<m; i++){
			for(int j=0; j<n; j++){
				fr = new Frame( "["+i+","+j+"]");
				fr.setSize(width-10, height-10);
				fr.setLocation(i*width, j*height);
				fr.setBackground(c1.get(n1++%c1.size()));
				fr.setResizable(false);
				fr.setVisible(true);
			}
		}
		
	}
}


补充:

布局管理器

FlowLayout布局,这个是从左到右依次布局的,是Panel的默认布局方式。

BorderLayout布局,这个是分东南西北中布局的,是Frame的默认布局方式的。


事件处理的GUI例子:

import java.awt.Color;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Label;
import java.awt.Point;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.ArrayList;
import java.util.Iterator;


public class TestMouseAdapter {
	public static void main(String[] args){
		new MouseFrame();
		
	}

}
class MouseFrame extends Frame{
	ArrayList<Point> points = null;
	Label lab = null;
	public MouseFrame() {
		points = new ArrayList<Point>();
		setLayout(null);
		lab = new Label();
		add(lab);
		setTitle("测试鼠标事件!");
		setBounds(300,35,800,600);
		lab.setBounds(0, getHeight()-30, getWidth(), 20);
		setVisible(true);
		addMouseListener(new Monitor());
		addKeyListener(new KeyListener() {
			
			@Override
			public void keyTyped(KeyEvent arg0) {
				// TODO Auto-generated method stub
				
			}
			
			@Override
			public void keyReleased(KeyEvent arg0) {
				// TODO Auto-generated method stub
				
			}
			
			@Override
			public void keyPressed(KeyEvent k) {
				// TODO Auto-generated method stub
				setTitle(String.valueOf(lab.getText().length()+1));
				String str = lab.getText();
				str += String.valueOf(k.getKeyChar());
				if(str.length()>115){
					str = str.substring(str.length()-115);
				}
				lab.setText(str);
			}
		});
		addWindowListener(new WindowAdapter() {

			@Override
			public void windowClosing(WindowEvent e) {
				// TODO Auto-generated method stub
				//super.windowClosed(e);
				setVisible(false);
				System.exit(0);
			}
			
		});
	}
	
	

	@Override
	public void paint(Graphics g) {
		// TODO Auto-generated method stub
		Iterator<Point> i = points.iterator();
		while(i.hasNext()){
			Point p = i.next();
			g.setColor(Color.red);
			g.fillOval(p.x, p.y, 10, 10);
		}
		super.paint(g);
	}
	

	void addPoint(Point p){
		points.add(p);
	}
}
class Monitor extends MouseAdapter{

	@Override
	public void mousePressed(MouseEvent e) {
		// TODO Auto-generated method stub
		MouseFrame f = (MouseFrame)e.getSource();
		f.addPoint(new Point(e.getX(),e.getY()));
		f.repaint();
		super.mousePressed(e);
	}
	
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值