• 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);
    	}
    	
    }


  • 相关阅读:
    H3C防火墙/路由器通过Track实现双线接入
    为了安装runlike 升级python2至python3
    URL:windows_exporter-0.13.0-amd64
    ES_Start
    luogu4323 独特的树叶
    luogu5043
    java操作Jacoco合并dump文件
    【Azure 云服务】Azure Cloud Service 为 Web Role(IIS Host)增加自定义字段 (把HTTP Request Header中的User-Agent字段增加到IIS输出日志中)
    【Azure 应用服务】App Service下部署的应用报错 Out of Memory
    【Azure Developer】使用Key Vault的过程中遇见的AAD 认证错误
  • 原文地址:https://www.cnblogs.com/arbboter/p/4225284.html
Copyright © 2020-2023  润新知