• Java基础6——GUI


    GUI是图形用户接口,与之相对的是CLI,即命令行接口

    GUI在awt和swing包下进行操作
    java.awt 抽象窗口工具 需要调用本地系统方法实现功能 重量级控件
    javax.swing 在awt的基础上建立的一套图形界面系统,提供了更多的组件,而且完全由Java实现,增强了移植性,轻量级控件
    注:java和javax的区别:前者是基本的标准的java包,带x的是java的扩展包

    重量级轻量级并不是说包的轻重,而是和本地系统方法的耦合度相关,因此在Windows下用awt实现的一个按钮在Linux下外观就有可能不一样

    Component是一个具有图形表示能力的对象

    继承体系图

    上图中左边的Container Window Panel Frame Dialog FileDialog是容器组件

    右边的Button Label Checkbox TextComponent TextArea Textfield是基本组件

    基本组件依赖于容器组件

    Window类的对象是一个没有边界和菜单栏的顶层窗口,窗口的默认布局是BorderLayout
    Frame实Window的子类,是带有标题和边框的顶层窗口

    public class FrameDemo{
        public static void main(String[] args){
            //创建窗体对象 构造一个最初不可见的Frame新实例
            Frame f=new Frame();//java.awt.Frame
            //调用一个方法,让窗体可见
            //f.show();//show方法已过时
            f.setTitle("helloworld");
            f.setSize(400,300);//第一个是宽,第二个是高,单位像素
            f.setLocation(400,200);//x坐标 y坐标
            f.setVisible(true);
            System.out.println("helloworld");
        }
    }
    public class FrameDemo{
        public static void main(String[] args){
            Frame f=new Frame("设置方法调用的前后关系");
            
            f.setSize(400,300);        
            //通过下面的方法也可以设置尺寸
            //Dimension d=new Dimension(400,300);
            //f.setSize(d);
            
            f.setLocation(400,200);
            //通过下面的方法也可以设置位置
            //Point p=new Point(400,200);
            //f.setLocation(p);
            
            //还可以用一个方法来搞定
            //f.setBounds(400,200,400,200);//类似canvas里面的fillRect
            
                    //如果需要延迟一段时间出现,将其放在setLocation和setSize之后效果比较好
            try{
                Thread.sleep(3000);
            }catch(InterruptedException e){
                e.printStackTrace();
            }
            
            f.setVisible(true);
        }
    }
    public class FrameDemo{
        public static void main(String[] args){
            Frame f=new Frame("窗体关闭");
            
            f.setBounds(400,200,400,200);
            f.setVisible(true);
            //窗口的关闭是利用了事件监听机制
            //事件源 事件 事件处理 事件监听 这些概念和js中的是一样的
            f.addWindowListener(new WindowListener(){
                //WindowListener是一个接口
                //这里会自动生成很多方法,因为接口WindowListenr必须实现所有的方法
                //但是我们需要监听的只有windowClosing一个
                //此处采用匿名内部类来做
                public void windowOpened(WindowEvent e){
                    
                }
                public void windowClosing(WindowEvent e){
                    System.exit(0);
                }
            });
            
        }
    }

    上面实现窗口关闭太繁琐,我们并不需要接口中的那么多方法,所以我们要想办法解决这个问题,下面改用适配器类来关闭

    public class FrameDemo{
        public static void main(String[] args){
            Frame f=new Frame("窗体关闭");
            
            f.setBounds(400,200,400,200);
            f.addWindowListener(new WindowAdapter(){
                public void windowClosing(WindowEvent e){
                    System.exit(0);
                }
            });
            f.setVisible(true);
        }
    }

    按钮点击

    先介绍一下窗体布局方案

    窗体布局即窗体中组建的排列方式
    流式布局FlowLayout 从上到下 从左到右 Frame默认采用此布局方式
    边界布局BorderLayout 东西南北中
    网格布局GridLayout 按照矩阵区域划分成等大的矩形
    网格包布局GridBagLayout 划分还是按照网格布局来,但可能一个按钮占两行 两列 或两行两列
    卡片布局CardLayout 其实就是选项卡

    public class FrameDemo{
        Frame f=new Frame("添加按钮");
        f.setBounds(400,200,400,300);
        f.setLayout(new FlowLayout());//设置布局方式为流式布局,否则的话按钮就会撑满整个Frame,非常大
        Button b=new Button("按钮");
        f.add(b);
        f.addWindowListener(new WindowAdapter(){
            public void windowClosing(WindowEvent e){
                System.exit(0);
            }
        });
        b.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                System.out.println("aaaa");
            }
        });
        f.setVisible(true);
    }

    数据转移案例

    public class FrameDemo{
        public static void main(String[] args){
            Frame f=new Frame("数据转移");
            f.setBounds(400,400,400,400);
            f.setLayout(new FlowLayout());
            
            //局部内部类访问局部变量的时候需要加final
            final TextField tf=new TextField(20);//20个字符,类似js里面的input
            
            Button b=new Button("数据转移");
            
            TextArea ta=new Textarea(10,40);//10行40列,类似textarea
            //add的是偶是有顺序的
            f.add(tf);
            f.add(b);
            f.add(ta);
            
            f.addWindowListener(new WindowAdapter(){
                public void windowClosing(){
                    System.exit(0);
                }
            });
            
            b.addActionListener(new ActionListener(){
                public void actionPerformed(ActionEvent e){
                    String tf_str=tf.getText().trim();
                    tf.setText("");
                    ta.append(tf_str+"
    ");
                    tf.requestFocus();
                }
            });
            
            f.setVisible(true);
        }
    }

    选项卡改变背景

    public class FrameDemo{
        public static void main(String[] args){
            Frame f=new Frame("数据转移");
            f.setBounds(400,400,400,400);
            f.setLayout(new FlowLayout());
            
            Button redButton=new Button("数据转移");
            
            redButton.addMouseListener(new MouseAdapter(){
                //public void mouseClicked(MouseEvent e){
                //    f.setBackground(Color.RED);
                //}
                //类似js中的mouseover
                public void mouseEntered(MouseEvent e){
                    f.setBackground(Color.RED);
                }
                //类似js中的mouseout
                public void mouseExited(MouseEvent e){
                    f.setBackground(Color.GREEN);
                }
            });
        }
    }

    只能输数字的输入框

    public class FrameDemo{
        public static void main(String[] args){
            Frame f=new Frame("xxx");
            f.setBounds(400,400,400,400);
            f.setLayout(new FlowLayout());
            
            Label label=new Label("只能输入数字");
            TextField tf=new TextField(40);
            
            f.add(label);
            f.add(tf);
            
            f.addWindowListener(new WindowAdapter(){
                public void windowClosing(WindowEvent e){
                    System.exit(0);
                }
            });
            
            tf.addKeyListener(new KeyAdapter(){
                public void keyPress(WindowEvent e){
                    char ch=e.getKeyCar();
                    if(ch<'0'||ch>'9'){
                        e.consume();
                    }
                }
            });
            
            f.setVisible(true);
        }
    }

    一级菜单案例

    public class FrameDemo{
        public static void main(String[] args){
            Frame f=new Frame("一级菜单");
            f.setBounds(400,400,400,400);
            f.setLayout(new FlowLayout());
            
            //菜单栏
            MenuBar mb=new MenuBar();
            //菜单
            Menu m=new Menu("文件");
            //菜单项
            MenuItem mi=new MenuItem("退出");
            
            m.add(mi);
            mb.add(m);
            
            f.setMenuBar(mb);
            
            f.addWindowListener(new WindowAdapter(){
                public void windowClosing(WindowEvent e){
                    System.exit(0);
                }
            });
            mi.addActionListener(new ActionListener(){
                public void actionPerformed(ActionEvent e){
                    System.exit(0);
                }
            });
            f.setVisible(true);
        }
    }

    多级菜单案例

    public class FrameDemo{
        public static void main(String[] args){
            Frame f=new Frame("多级菜单");
            f.setBounds(400,400,400,400);
            f.setLayout(new FlowLayout());
            
            //菜单栏
            MenuBar mb=new MenuBar();
            //菜单
            Menu m1=new Menu("文件");
            Menu m2=new Menu("更改名称");
            //菜单项
            final MenuItem mi1=new MenuItem("aaa");
            MenuItem mi2=new MenuItem("bbb");
            MenuItem mi3=new MenuItem("ccc");
            MenuItem mi4=new MenuItem("ddd");
            MenuItem mi5=new MenuItem("退出");
            
            m2.add(mi1);
            m2.add(mi2);
            m2.add(mi3);
            
            m1.add(m2);
            m1.add(mi4);
            m1.add(mi5);
            
            mb.add(m1);
            
            f.setMenuBar(mb);
            
            f.addWindowListener(new WindowAdapter(){
                public void windowClosing(WindowEvent e){
                    System.exit(0);
                }
            });
            mi1.addActionListener(new ActionListener(){
                public void actionPerformed(ActionEvent e){
                    f.setTitle(mi1.getLabel());
                }
            });
            mi4.addActionListener(new ActionListener(){
                public void actionPerformed(ActionEvent e){
                    Runtime r=Runtime.getRuntime();
                    try{
                        r.exec("notepad");//打开记事本
                    }catch(IOException e){
                        e1.printStackTrace();
                    }
                }
            });
            mi5.addActionListener(new ActionListener(){
                public void actionPerformed(ActionEvent e){
                    System.exit(0);
                }
            });
            f.setVisible(true);
        }
    }
  • 相关阅读:
    Spring Boot WebFlux-02——WebFlux Web CRUD 实践
    Struts2
    spring04
    spring03
    spring02
    jQuery04
    spring01
    jQuery03
    Linux学习笔记《六》
    请求报错:“应以Content-Type: application/x-www-form-urlencoded为请求类型,在form表单中提交登录信息。"
  • 原文地址:https://www.cnblogs.com/zhaohuiziwo901/p/5269064.html
Copyright © 2020-2023  润新知