Java–GUI的介绍与使用

1.概念

GUI(Graphical User Interface 接口,界面)即图形用户界面,它能使应用程序看上去更加友好。

java中提供了3个包做GUI开发

  • java.awt包-主要提供字体/布局分布器
  • javax.swing包-主要提供各种组件
  • java.awt.event包-事件处理,后台处理的能力

2.Swing

  • Swing是纯Java组件,使得应用程序在不同的平台上运行时具有相同外观和相同的行为
  • Swing中的大部分组件类位于javax.swing中
  • Swing中的组件非常丰富,支持很多功能强大的组件

3.容器组件

  • Java大的图形用户界面的基本组成部分是组件,组件是一个以图形化的方式显示在屏幕上并能与用户进行交互的对象
  • 功能组件不能独立的显示出来,必须将功能组件放在一定的容器组件(container)中才可以显示出来
  • 容器组件可以容纳多个功能组件 ,通过调用容器组件的add(Component comp)方法向容器中添加功能组件

1)常见容器组件

1.窗口(Frame)

JFrame用于在Swing程序中创建窗体

JFrame类的构造方法:

构造方法

说明

JFrame()

创建新窗体,该窗体初始为不可见

JFrame(String title)

创建新窗体,使用参数title指定标题,该窗体初始为不可见

JFrame常用方法:

void setSize(int width,int heigth)//设置窗口大小
void setVisible(boolean b)//设置窗口是否可视化
void setTitle(String title)//设置窗口标题
void setResizable(boolean resizable)//设置窗口是否可拉伸
void setLocation(int x,int y)//设置窗口位置
void setBounds(int x,int y,int width,int height)//设置窗口的x,y位置,窗口大小x,y
void setLocationRelativeTo(null)//设置窗口居中
void setDefaultOperation(int operation)//关闭选项,EXIT_ON_CLOSE关闭窗口,退出程序.DO_NOTHING_ON_CLOSE,无法关闭窗口
Component add(Component comp)//往面板中添加一个组件

2.面板(Panel)

JPanel提供面板,它是轻量级的容器

面板中可以添加其他组件,也可以设置布局,我们一般使用面板来实现布局嵌套

构造方法

说明

JPanel()

创建一个空面板

JPanel(Manaer layout)

创建带有指定布局的面板

常用方法:

void seBackground(Color bg)//设置面板的背景色,由参数bg指定颜色
void setLayout(LayoutManager mgr)//设置面板布局,参数是布局管理器
Component add(Component comp)//往面板中添加一个组件
void remove(Component comp)//从面板中移除指定的组件
void removeAll()//从面板中移除所有组件

2.布局管理器

Java中的图形界面在布局管理器上采用容器和布局相分离的方案,也就是说容器只是把组件放进来,但它不管怎样放置。至于如何放置需要用到布局管理器(Container)。Java中有几种常用的布局管理器,分别是:FlowLayout(流式布局),BorderLayout(边界布局),GirdLayout(网格布局)

(1)FlowLayout

FlowLayout布局管理器是流式布局管理器,它将组件按照从左到右、从上到下的顺序来安排,并在默认情况使组件居中放置。对组件逐行定位,行内从左到右,一行排满后换行。不改变组件的大小,按组件原有尺寸显示组件,可设置不同的组件间距,行距以及对齐方式

构造方法:

new FlowLayout(FlowLayout.RIGHT,20,40);//右对齐,组件之间水平间距20个像素,垂直间距40个像素
new FlowLayout(FlowLayout.LEFT);//左对齐,水平和垂直间距为缺省值(5)
new FlowLayout();//使用缺省的居中对齐方式,水平和垂直间距为缺省值(5)

(2)BorderLayout

  • BorderLayout布局管理器只允许在容器内放置5个组件,这5个组件的位置是BorderLayout类中的North,South,East,West,Center5个常量来确定的,它们对应着容器中的上下左右中。组件在BorderLayout中的大小都是可以改变的。一般情况下可以让中间区域大一些,而且可以只用其中几个区域。
  • BorderLayout将整个容器的布局划分为成

东(EAST),西(WEST),南(SOUTH),北(NORTH)、中(CENTER)5个区域,组件只能被添加到指定的区域

  • 如不指定组件的加入位置,则默认加入到CENTER区。每个区域只能加一个组件,如加入多个,则先前加入的会被覆盖。
  • BorderLayout型布局容器尺寸缩放原则:
    北、南两个区域在水平方向缩放
    东、西两个区域在垂直方向缩放
    中部可在两个方向上缩放

(3)GirdLayout

  • GirdLayout布局管理器是矩形网络,在网格中放置组件,每个网格的高度和宽度相等,组件随着网格的大小而在水平和垂直方向上拉伸,网格的大小是由容器的大小和创建网络的多少来确定的,其用法如下:
    this.setLayout(new GirlLayout(2,3));//创建一个2行3列的网格
    this.add(new Button(“按钮”));
  • 当组件数目大于网格数时,GirlLayout保持行数不变而自动增加行数
  • GirdLayout型布局管理器将空间划分成规则的矩形网格,每个单元格区域的大小相等,组件被添加到每个单元格中,先从左到右添满一行后换行,再从上到下
  • 在GirdLayout构造方法中指定分割的行数和列数
public class Demo2 extends JFrame{
    public static void main(String[] args) {
        Demo2 d = new Demo2();//创建窗口对象
        d.SetFrame();//对窗口特征进行设置
        d.setVisible(true);//让窗口可视化,默认是不显示
    }
    public void SetFrame(){
        this.setSize(500,500);//给窗口设置宽高
        this.setTitle("GUI上课例子");//给窗口添加题目
        this.setResizable(false);//设置窗口是否可拉伸
        this.setLocationRelativeTo(null);//设置窗口居中
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);


        // 创建面板组件,面板上就可以放其他组件
        /*
        JPanel面板组件布局方式默认为流式布局

         */
        JPanel jp = new JPanel(new FlowLayout(FlowLayout.LEFT,10,20));

        JButton jb1 = new JButton("按钮1");
        JButton jb2 = new JButton("按钮2");
        JButton jb3 = new JButton("按钮3");
        JButton jb4 = new JButton("按钮4");
        JButton jb5 = new JButton("按钮5");
        jp.add(jb1);
        jp.add(jb2);
        jp.add(jb3);
        jp.add(jb4);
        jp.add(jb5);


        this.add(jp);//给窗口上添加慢板
    }
}
public class Demo3 extends JFrame{
    public static void main(String[] args) {
        Demo3 d = new Demo3();//创建窗口对象
        d.SetFrame();//对窗口特征进行设置
        d.setVisible(true);//让窗口可视化,默认是不显示
        //d.dispose();//释放窗口
    }
    public void SetFrame(){
        this.setSize(500,500);//给窗口设置宽高
        this.setTitle("GUI上课例子");//给窗口添加题目
        this.setResizable(false);//设置窗口是否可拉伸
        //this.setLocation(100,100);//设置窗口位置
        //this.setBounds(500,100,500,500);//设置窗口的x,y位置,窗口大小x,y
        this.setLocationRelativeTo(null);//设置窗口居中
        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        /*
        关闭选项,EXIT_ON_CLOSE关闭窗口,退出程序. DO_NOTHING_ON_CLOSE,无法关闭窗口
         */



        // 创建面板组件,面板上就可以放其他组件
        /*
        JPanel面板组件布局方式默认为流式布局

         */
        JPanel jp = new JPanel(new BorderLayout());
        //jp.setBackground(Color.CYAN);//设置面板背景颜色

        JButton jb1 = new JButton("按钮1");//按钮组件
        JButton jb2 = new JButton("按钮2");//按钮组件
        JButton jb3 = new JButton("按钮3");//按钮组件
        JButton jb4 = new JButton("按钮4");//按钮组件
        JButton jb5 = new JButton("按钮5");//按钮组件
        jp.add(jb1,BorderLayout.NORTH);
        jp.add(jb2,BorderLayout.WEST);
        jp.add(jb3,BorderLayout.EAST);
        jp.add(jb4,BorderLayout.SOUTH);
        jp.add(jb5);

        //jp.remove(jb);//删除面板指定组件
        //jp.removeAll();//删除面板所有组件

        this.add(jp);//给窗口添加面板
    }
}
public class Demo4 extends JFrame {
    public static void main(String[] args) {
        Demo4 d = new Demo4();//创建窗口对象
        d.SetFrame();//对窗口特征进行设置
        d.setVisible(true);//让窗口可视化,默认是不显示
        //d.dispose();//释放窗口
    }
    public void SetFrame(){
        this.setSize(500,500);//给窗口设置宽高
        this.setTitle("GUI上课例子");//给窗口添加题目
        this.setResizable(false);//设置窗口是否可拉伸
        //this.setLocation(100,100);//设置窗口位置
        //this.setBounds(500,100,500,500);//设置窗口的x,y位置,窗口大小x,y
        this.setLocationRelativeTo(null);//设置窗口居中
        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        /*
        关闭选项,EXIT_ON_CLOSE关闭窗口,退出程序. DO_NOTHING_ON_CLOSE,无法关闭窗口
         */



        // 创建面板组件,面板上就可以放其他组件
        /*
        JPanel面板组件布局方式默认为流式布局
         */
        JPanel jp = new JPanel(new GridLayout(2,2));

        JButton jb1 = new JButton("按钮1");//按钮组件
        JButton jb2 = new JButton("按钮2");//按钮组件
        JButton jb3 = new JButton("按钮3");//按钮组件
        JButton jb4 = new JButton("按钮4");//按钮组件
        JButton jb5 = new JButton("按钮5");//按钮组件
        jp.add(jb1);
        jp.add(jb2);
        jp.add(jb3);
        jp.add(jb4);

        this.add(jp);//给窗口添加面板
    }
}

3.功能组件

1)标签(JLabel)

  • 标签是容纳文本和图标的控件,通常用来在界面中识别的控件
  • 构造函数:
  • JLable()创建一个空的标签
  • JLable(String text)创建一个带文本的标签
  • JLable(Lcon image)创建一个带图像的标签

2)单行文本组件(JTextField)

构造函数

  • JTextField()创建一个空的文本框
  • JTextField(String text) 创建一个带文字的文本框
  • JTextField(int columns) 创建一个设置列数的空文本框
  • JTextField(String text,int columns) 创建一个设置列数的带文字的 文本框

3)多行文本框组件(JTextArea)

构造函数

  • JTextArea() 创建一个空的文本域;
  • JTextArea(Strinf text) 用指定文本初始化文本域
  • JTextArea(int rows,int columns) 创建一个指定行数和列数的空文本域
  • JTextArea(String text,int rows,int columns) 创建一个带文本,并指定行数和列数
//创建面板组件,面板上就可以放其他组件
                 /*
                   JPanel组件默认布局方式为流式布局:
                     把面板分为一行行,从左只有排放组件,右侧如果放不下了,重启一行
                  */
        JPanel jp = new JPanel();
        /*
        常用组件
        JLabel 标签组件 可以放文字、图标
         */
        JLabel jl = new JLabel("账号");
                //jl.setText("aa");另一种命名
                jl.setFont(new Font("楷体",Font.BOLD,20));
        /*
        单行文本框
         */
                                            //文本框
        JTextField  jtd = new JTextField("账号",15);
        System.out.println(jtd.getText());//获得单行文本框的内容
        //jtd.setEditable(false);//设置文本框的内容是否可以编辑


        jp.add(jl);
        jp.add(jtd);
        this.add(jp);
//创建面板组件,面板上就可以放其他组件
                 /*
                   JPanel组件默认布局方式为流式布局:
                     把面板分为一行行,从左只有排放组件,右侧如果放不下了,重启一行
                  */
            JPanel jp = new JPanel();

            //常用组件
            //多行文本
            JTextArea jta = new JTextArea(5,20);//设置为5行20列
                        jta.setLineWrap(true);//强制换行
                        jta.setWrapStyleWord(true);//以单词为单位换行
                    JScrollPane jsp = new JScrollPane(jta);//创建一个可以添加滚动条的面板,封装文本域
            jp.add(jta);
            //按钮
            JButton jb = new JButton("按钮");
            jb.setEnabled(false);//禁用按钮
            jb.setToolTipText("点击保存");
            jp.add(jb);
            this.add(jp);

4)密码框组件(JPasswordField)

构造函数:

  • JPasswordField() 创建一个空密码框
  • JPasswordField(String text) 创建一个有密码字符串的密码框
  • JPasswordField(String text,int columns) 创建一个有密码字符串且设置了列数的密码框
//创建面板组件,面板上就可以放其他组件
                 /*
                   JPanel组件默认布局方式为流式布局:
                     把面板分为一行行,从左只有排放组件,右侧如果放不下了,重启一行
                  */
        JPanel jp = new JPanel();

        //常用组件
        /*
            密码框组件
         */
        JLabel jl = new JLabel("密码");
        jp.add(jl);
                                                    //设置初始密码
        JPasswordField jpwf = new JPasswordField("123",15);
        jp.add(jpwf);
        //把char数组转为字符串
        String str =String.valueOf(jpwf.getPassword());
        this.add(jp);

(5)菜单组件

  • 菜单栏组件
  • 构造方法:JMenuBar()
  • 方法:add(menu);向菜单栏添加菜单
  • 菜单组件
  • 构造方法:JMenu(“菜单名称”);
  • 方法:add(menuItem);向菜单添加菜单选项
  • 菜单项组件
  • 构造方法:JMenuItem(“菜单项名称”)
  • 将菜单项添加到窗口:setJMenuBar(menuBar);
public class Demo8 extends JFrame {
    public static void main(String[] args) {
        Demo8 d = new Demo8();
            d.SetFream();
            d.setVisible(true);
    }
    public void SetFream(){
        this.setSize(500, 500);
        this.setTitle("GUI窗口练习");
        this.setLocationRelativeTo(null);//设置窗口位置  水平垂直居中
        this.setResizable(false);//设置不能改变大小
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//关闭窗口时 退出程序

        //创建面板组件,面板上就可以放其他组件
                 /*
                   JPanel组件默认布局方式为流式布局:
                     把面板分为一行行,从左只有排放组件,右侧如果放不下了,重启一行
                  */
        JPanel jp = new JPanel();

        //常用组件
        //菜单栏
        JMenuBar jmb = new JMenuBar();

        //菜单
        JMenu jm1 = new JMenu("文件");
        JMenu jm2 = new JMenu("窗口");
        JMenu jm3 = new JMenu("帮助");

        //菜单项
        JMenuItem jt1 = new JCheckBoxMenuItem("新建");
        JMenuItem jt2 = new JCheckBoxMenuItem("保存");
        JMenuItem jt3 = new JCheckBoxMenuItem("关闭");
        JMenuItem jt4 = new JCheckBoxMenuItem("重置");
        JMenuItem jt5 = new JCheckBoxMenuItem("注册");
        JMenuItem jt6 = new JCheckBoxMenuItem("关于");
        JMenuItem jt7 = new JCheckBoxMenuItem("打开");

        //将菜单与菜单项关联
        jm1.add(jt1);
        jm1.add(jt7);
        jm1.add(jt2);
        jm2.add(jt3);
        jm2.add(jt4);
        jm3.add(jt5);
        jm3.add(jt6);

        //将菜单添加到菜单栏
        jmb.add(jm1);
        jmb.add(jm2);
        jmb.add(jm3);

        this.add(jmb);
    }
}

4.事件处理

Java中,事件处理的基本思路:

一个源(事件源)产生一个事件(事件对象)并把它送到监听器那里,监听器只是简单的等待,直到它收到一个事件,一旦事件被接受,监听器将处理这些事件;

一个事件源必须注册监听器以便监听器可以接受关于一个特定事件的通知

监听器类型为ActionListener.

//添加事件监听器(此处即为匿名类) 
按钮对象.addActionListener(new ActionListener() { 
  // 事件处理
   @Override 
   public void actionPerformed(ActionEvent e) { 
       执行操作
   } 
});
//演示鼠标事件
        loginBtn.addMouseListener(new MouseListener() {
            @Override
            public void mouseClicked(MouseEvent e) {
                System.out.println("鼠标点击");//按下 释放两个动作完成后算一次点击
            }

            @Override
            public void mousePressed(MouseEvent e) {
                System.out.println("鼠标按下");
            }

            @Override
            public void mouseReleased(MouseEvent e) {
                System.out.println("鼠标释放");
            }

            @Override
            public void mouseEntered(MouseEvent e) {
                System.out.println("鼠标移入");
            }

            @Override
            public void mouseExited(MouseEvent e) {
                System.out.println("鼠标移出");
            }
        });
public class LoginFream extends JFrame {
    public void setFrame() {
        this.setSize(300, 300);
        this.setTitle("xxx聊天室");
        this.setLocationRelativeTo(null);
        this.setResizable(false);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        //创建面板
        JPanel jp = new JPanel(new GridLayout(4, 1));
        //欢迎登录面板
        JPanel welPanel = new JPanel();
        JLabel welLabel = new JLabel("欢迎登录");
        welPanel.add(welLabel);
        //账号
        JPanel accPanel = new JPanel();
        JLabel accLabel = new JLabel("账号");
        JTextField accText = new JTextField(15);
        accPanel.add(accLabel);
        accPanel.add(accText);
        //密码
        JPanel pwdPanel = new JPanel();
        JLabel pwdLabel = new JLabel("密码");
        JPasswordField pwdText = new JPasswordField(15);
        pwdPanel.add(pwdLabel);
        pwdPanel.add(pwdText);
        //按钮
        JPanel btnPanel = new JPanel();
        JButton loginBtn = new JButton("登录");
        JButton regBtn = new JButton("注册");
        btnPanel.add(loginBtn);
        btnPanel.add(regBtn);

        jp.add(welPanel);
        jp.add(accPanel);
        jp.add(pwdPanel);
        jp.add(btnPanel);
        this.add(jp);


       //为登录这个按钮注册时间监听器
        // loginBtn.addActionListener(new D());
                                    //匿名内部类写法
        loginBtn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                String account =accText.getText();//获得账号信息
                String password = String.valueOf(pwdText.getPassword());//获得密码信息
                //验证操作
                if (account.length()==0){
                    JOptionPane.showMessageDialog(null,"请输入账号");
                    return;
                }
                if (password.length()==0){
                    JOptionPane.showMessageDialog(null,"请输入密码");
                    return;
                }
                System.out.println("success");
            }
        });

    }

    public static void main(String[] args) {
        LoginFream loginFrame =    new LoginFream();
        loginFrame.setFrame();
        loginFrame.setVisible(true);
    }

}

5.对话框

JOptionPane对话框

showMessageDialog():消息对话框

主要有五种消息类型,类型不同,图标不同:

  • ERROR_MESSAGE 错误消息提示
  • INFORMATION_MESSAGE 信息提示
  • WAGNING_MESSAGE 警告提示
  • QUESTON_MESSAGE 问题提示
  • PLAIN_MESSAGE 简洁提示

showConfirmDialog():确认对话框

主要有四种消息类型,类型不同,图标不同

  • DEFAULT_OPTION 默认选项
  • YES_NO_OPTION 是/否选项
  • YES_NO_CANCEL_OPTION 是/否/取消选项
  • OK_CANCEL_OPTION 确认/取消

对话框 参数及其含义 :

  • parentComponent 对话框所在的容器
  • message 提示消息
  • title 标题
  • option Type 选择按钮类型
  • message Type 消息类型