图形界面(Java)

1.JFrame 的作用是什么?

public class Main {
    public static void main(String[] args) {
        JFrame jf = new JFrame("hello JFrame");
        //设置窗口在关闭时,程序的响应
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jf.setSize(200,200);        //设置窗口大小
        jf.setVisible(true);       //是否可见
        //为窗口添加一个标签
        JLabel lable = new JLabel();    //创建 JLabel 对象
        lable.setText("hello this id one lable");   //设置标签文本
        jf.add(lable);                  //把标签加到 jframe 中
    }  
}

以上代码中的 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE) 方法是必须要调用的,否则默认情况下,视窗关闭时是不会结束程序的

  • JFrame 是 Swing 创建视窗的一个基础类,它像一个容器一样,可以包含其它的组件,是其它组件依赖生存的对象,使用步骤:
    • 用 new 语句创建 JFrame 对象,可以通过构造方法传入视窗标题参数
    • 设置窗口关闭时的行为,一般是结束进程
    • 设置视窗的外观,例如,尺寸、可见与否等
    • 为窗口中添加其它组件,例如,标签、按钮等
    • 必要时还可以添加一些事件,例如,WindowListener 等

如何创建一个按钮

  • 在 Swing 中,创建一个按钮需要使用 JButton 类,按钮的文本可以通过 JButton 的构造方法提供(按钮的表面不仅可以写文字,还可以显示各种图形)

    public class HelloJButton {
       public static void main(String[] args){
           JFrame jf = new JFrame("hello swing");
           //设置窗口关闭时,程序的响应
           jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
           jf.setSize(500,500);
           jf.setVisible(true);
           jf.setLayout(new FlowLayout());  //设置布局格式
           //为窗口添加一个按钮
           JButton btn = new JButton("my button");  //创建一个按钮对象
           jf.add(btn);
       } 
    }
    

    如果没有设置页面布局格式,JFrame 是无法直接加入 JButton 组件的,即调用了 add() 方法,界面也是空的

  • 在 Swing 程序中,一般使用 JButton 类来定义按钮事件:

    • 用 new 语句创建 JButton 对象,可以通过构造方法传入文本参数
    • 把创建好的 JButton 对象加入到容器组件中

如何使用文本输入组件

  • 根据文本输入的长度不同,一般可以分为文本框和文本域两种文本输入组件。Swing 提供了 JTextField 来对文本框提供支持,用 JTextArea 来表示一个文本框

    • JTextField 代表的是只能单行输入的文本组件,与按钮类似

      public class helloJTextField {
          
          public static void main(String[] args){
              JFrame jf = new JFrame("heelo Text");
              jf.setLayout(new FlowLayout());
              //为窗口添加一个文本框
              JTextField jtf = new JTextField(10);
              jtf.setText("初始化内容");
              jf.add(jtf);
              showMe(jf);   
          }
          private static void showMe(JFrame jf){
              jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
              jf.setSize(500,500);
              jf.setVisible(true);
          } 
      }
      
    • JtextArea 允许多行输入,用户在 JtextArea 中按 enter 键的时候,字符就会出现换行

      public class HelloJTextAra {
          public static void main(String[] args){
              
              JFrame jf = new JFrame("hello Text");
              jf.setLayout(new FlowLayout());
              //为窗口添加文本域
              JTextArea ja = new JTextArea(5,5); //创建一个5行5列的文本域对象
              ja.setText("初始化内容");
              jf.add(ja);
              showMe(jf); 
          }
          
          private static void showMe(JFrame jf){
              jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
              jf.setSize(500,500);
              jf.setVisible(true);  
          }
      }
      
  • JTextField 组件在创建对象的时候,一般需要提供长度参数。JTextArea 组件在创建过程中提供的是长度和高度两个参数


如何捕获事件

  • 什么是事件?就是一个对象(A)的状态改变时,通知其它对象(B)发生了这么一件事,让它做出某种反应。在 Swing 编程的过程中,一般是通过一下步骤使用事件模型:

    • 创建组件对象

    • 创建实现了监听器接口或者继承自适配器类的实现类,实现需要进行相应动作的抽象方法

    • 调用组件对象的 addXXXListener() 方法,为组件添加监听器

      public class HelloEvent {
          //创建文本对象框
          private static JTextField text = new JTextField(10);
          public static void main(String[] args){
              JFrame jf = new JFrame("hello event");
              jf.setLayout(new FlowLayout());
              //为窗口添加一个文本框
              jf.add(text);
              //为窗口添加一个按钮
              JButton btn = new JButton("my button");
              jf.add(btn);
              btn.addActionListener(new ActionListener(){
                  public void actionPerformed(ActionEvent e){
                      HelloEvent.text.setText("按钮被点击了");
                  }
              });      //添加事件
              showMe(jf);
          }
          
          private static void showMe(JFrame jf){
              jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
              jf.setSize(500,500);
              jf.setVisible(true);
          }  
      }
      

布局控制

  • 在 Swing 中,常用的布局管理器包括:BorderLayout、FlowLayout 和 GridLayout

    BorderLayout 的几种方位变量
    变量 说明
    BorderLayout.NORTH 上端
    BorderLayout.SOUTH 下端
    BorderLayout.WEST 左端
    BorderLayout.EAST 右端
    BorderLayout.CENTER 中间
    使用 BorderLayout 进行布局
    public class HelloBorderLayout {
        public static void main(String[] args){
            JFrame jf = new JFrame("hello BorderLayout");
            jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            jf.setSize(500,500);
            jf.setVisible(true);
            
            jf.setLayout(new BorderLayout());   //设置布局格式
            jf.add(new JButton("east"),BorderLayout.EAST);          //东部
            jf.add(new JButton("center"),BorderLayout.CENTER);      //中间
            jf.add(new JButton("south"),BorderLayout.SOUTH);        //南部
            jf.add(new JButton("north"),BorderLayout.NORTH);        //北部
            jf.add(new JButton("west"),BorderLayout.WEST);          //西部
        }  
    }
    
  • BorderLayout 是 Swing 容器的默认布局管理器,它的含义是采用东、南、西、北、中5个方位来进行布局,可以分别往这些方位上放置组件,使用 add() 方法

  • FolwLayout 的含义是把组件从左往右的排列,当排列不能排以后就换到下一排

    使用 FlowLayout 进行布局
    public class HelloFlowLayout {
        public static void main(String[] args){
            JFrame jf = new JFrame("hello FlowLayout");
            jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            jf.setSize(600,600);
            jf.setVisible(true);
            
            jf.setLayout(new FlowLayout());
            for(int i=0;i<10;i++){
                jf.add(new JButton(i+""));
            }   
        }   
    }
    
  • 当某种容器需要放置该布局管理器时,只需要调用 setLayout() 方法,传入一个 FlowLayout 对象即可,在加入组件的时候,直接调用 add() 方法,不需要指定其它参数

  • GridLayout 是一种表格式的布局管理器,它把组件按照表格的方式来存放,从第一行到最后一行,从第一列到最后一列的摆放加入的组件。GridLayout 布局会填满整个容器,当容器变大时,表格也会变大

    GridLayout 布局使用
    public class HelloGridLayout {
        public static void main(String[] args){
            JFrame jf = new JFrame("hrllo GridLayout");
            jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            jf.setSize(500,500);
            jf.setVisible(true);
            
            GridLayout grid = new GridLayout(10,10);
            jf.setLayout(grid);
            
            for(int i=0;i<100;i++){
                jf.add(new JButton(""+i));
            }
        }
        }
    

    事件模型

    常见事件的监听器、事件类型、添加和取消事件注册方法
监听器、事件 添加和取消方法 支持该事件的常用组件
ActionEvent
ActionListener
addActionListener()
removeActionListener()
JButton、JList、JMenuItem
KeyEvent
KeyListener
addKeyListener()
removeKeyListener()
几乎所有组件
MouseEvent
MouseListener
addMouseListener()
removeMouseListener()
几乎所有组件
WindowEvent
WindowListener
addWindowListener()
removewindowListener()
Window 及其子类,JDiaiog、Jframe
TextEvent
TextListener
addTextListener()
removeTextListener()
文本输入组件,JTextField、JTextArea
  • 尽管 Swing 的事件类型比较多,但是它们都有一个通用的使用和定义规则,主要有以下几点:
    • 组件都有 addXXXlistener() 和 removeXXXlistener() 方法,XXX 就代表了事件的类型和含义
    • XXX 事件的监听器类型叫做 XXXListener
    • XXX 事件的类名叫做 XXXEvent,它往往作为 XXXListener 接口方法中的参数类型

监听器的适配器作用是什么?

public class HelloKevent {
    public static void main(String[] args){
        JFrame jf = new JFrame("hello event");
        jf.setLayout(new FlowLayout());
        JTextField jtf = new JTextField(15);
        jf.add(jtf);
        jtf.addKeyListener(new KeyAdapter(){    //添加监听器
           public void keyPressed(KeyEvent e){
               System.out.println(e.getKeyChar()+"pressed");    //实现
           } 
        });  
        showMe(jf);
}
    
    private static void showMe(JFrame jf){
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jf.setSize(500,500);
        jf.setVisible(true);
    }
}
  • 在 Java 开发领域,有一种开发模式叫做适配器开发模式,Swing 的适配器正是采用了这种模式开发,为了避免代码的冗余,Swing 监听器的适配器就是为一些监听器接口的方法提供默认的空实现,这样开发者就可以直接继承自适配器就好,不必把每个接口都实现

posted @ 2021-11-02 21:34  这阵风是晚安  阅读(335)  评论(0编辑  收藏  举报