JAVA第十一章----GUI界面

GUI的概念

GUI(Graphical User Interface)即图形用户界面,是指采用图形方 式显示的用户界面,与早期计算机使用的命令行界面相比,图形界面对 于用户来说在视觉上更易于接受。

swing概述

● swing 是一个为Java设计的GUI工具包javax.swing,该包中包括了图形用户界面 的各种组件支持。

● 一个 Java 的图形界面,由各种不同类型的“元素”组成,这些“元素”被称为 组件(Component)。

● swing中的组件可以分为两大类:容器(如窗口,对话框,面板)和功能组件(如按钮,输 入框,菜单等)

容器组件

功能组件不能独立地显示出来,必须将组件放在一定的容器(container)中才 可以显示出来。

容器可以容纳多个组件,通过调用容器的add(Component comp)方法向容 器中添加组件。

窗口(JFrame)和面板(JPanel)是最常用的两个容器。

常用容器

JFrame类用来创建窗体; 我们的类可以直接继承该类,实现窗体制作.

设置窗体的常用方法

void setSize(int width, int height)

void setVisible(boolean b)

void setTitle(String title void setResizable(boolean resizable)

void setLocation(int x,int y)

void setLocationRelativeTo(null);

void setDefaultCloseOperation(int operation)

void dispose()

Jpanel

• JPanel面板,它是轻量级的容器;

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

 自己创建Jpanel面板对象,把JPanel作为一个组件添加到窗口或某个面板中.

常用方法:

void setBackground(Color bg)设置面板的背景色,由参数bg指定颜色

void setLayout(LayoutManager mgr)设置面板的布局,参数是布局管理器

Component add(Component comp)往面板中添加一个组件

布局管理器

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

FlowLayout

FlowLayout布局管理器是流式布局管理器,它将组件按照从左到右、从上到下的顺序来安排, 并在默认情况下使组件尽量居中放置。

this.setLayout(new FlowLayout());

FlowLayout布局管理器对组件逐行定位,行内从左到右,一行排满后换行。

不改变组件的大小,按组件原有尺寸显示组件,可设置不 同的组件间距,行距以及对齐方式。

构造方法 new FlowLayout(FlowLayout.RIGHT,20,40);

右对齐,组件之间水平间距20个像素,垂直间距40 个像素。

new FlowLayout(FlowLayout.LEFT);

左对齐,水平和垂直间距为缺省值(5)。

new FlowLayout();使用缺省的居中对齐方式,水平和垂直间距为缺省值(5)。

BorderLayout

BorderLayout布局管理器只允许在容器内放置5个组件,这5个组件的位置是由BorderLayout类中 的North、South、East、West和Center5个常量来确定的,他们对应着容器中的上下左右中,用法 如下: this.add(new Button(“按钮”) ,BorderLayout.NORTH);

this.add(new Button(“按钮”) ,BorderLayout.CENTER);

组件在BorderLayout中的大小都是可以改变的。一般情况下可以让中间区域大一些,而且可以只用其 中几个区域。

● BorderLayout将整个容器的布局划分成东(EAST)西(WEST)南(SOUTH)北(NORTH)中 (CENTER)五个区域,组件只能被添加到指定的区域。

● 如不指定组件的加入部位,则默认加入到CENTER区。

● 每个区域只能加入一个组件,如加入多个,则先前加入的会被覆盖。

GridLayout

●  GridLayout布局管理器是矩形网格,在网格中放置组件,每个网格的高度和宽 度都相等,组件随着网格的大小而在水平和垂直方向上拉伸,网格的大小是由容器的 大小和创建网格的多少来确定的。

其用法如下 this.setLayout(new GridLayout(2 , 3)); //创建一个2行3列的网格           this.add(new Button(“按钮”));

● 在 GridLayout 构造方法中指定分割的行数和列数.

常用组件

标签(JLabel)

标签是容纳文本和图标的控件,通常用来在界面中标识别的控件。

构造函数: JLabel() 创建一个空的标签 JLabel(String text) 创建一个带文本的标签

方法: void setText(String text) 设置标签上的文本

String getText() 获得标签上的文本

setFont(new Font(“宋体”,Font.BOLD, 18)); 设置字体

单行文本(JTextField)

JTextField的构造函数: JTextField(int columns)

方法: void setText(String text) 设置文本框中的文本

String getText() 获得文本框中的文本

多行文本框(JTextArea)

构造函数: JTextArea(int rows, int columns) 创建一个指定行数和列数的空文本域

方法: void setText(String text) 设置文本域中的文本

String getText() 获得文本域中的文本

void setFont(Font font) 设置文本域中文本的字体

void setLineWrap(boolean wrap) //是否自动换行,默认false

如果需要文本区自动出现滚动条,可将文本区对象放入滚动窗格(JScrollPane)中:

JScrollPane scrollPane = new JScrollPane(txtArea);

add(scrollPane );

密码框:JPasswordField

构造函数: JPasswordField(String text)

JPasswordField(String text, int columns)

方法: char[] getPassword()

按钮(JButton)

构造方法: JButton(String text) 创建一个带文本的标签

方法: void setBackground(Color bg) 设置按钮的背景色

void setEnabled(boolean b) 设置启用(或禁用)按钮,由参数b决 定

void setToolTipText(String text) 设置按钮的悬停提示信息

菜单栏组件:

构造方法:JMenuBar();

方法:add(menu); 向菜单栏添加菜单 菜单组件:

构造方法:JMenu(“菜单名称");

方法:add(menuItem); 向菜单添加菜单选项

菜单项组件:

构造方法:JMenuItem(“菜单项名称");

将菜单栏添加到窗口 setJMenuBar(menuBar);

事件处理

一个事件源产生一个事件并把它送到监听器那里,监听器一直等待,直 到它收到一个事件,一旦事件被接受,监听器将处理这些事件;

● 添加事件监听器(此处即为匿名类) 

按钮对象.addActionListener(new ActionListener() { 

  // 事件处理    

@Override     

public void actionPerformed(ActionEvent e) {    

     执行操作    } 

}); 

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class Longinfarm extends JFrame {
    public Longinfarm() throws HeadlessException {
        //在构造方法中对创建的窗口特征进行设置
        this.setSize(300, 300);//设置窗口大小
        this.setTitle("10086新手村");//设置标题
        //this.setLocation(600, 300);//设置窗口位置
        this.setLocationRelativeTo(null);//设置窗口水平垂直剧中
        this.setResizable(false);//设置窗口不可以调整大小
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//关闭窗口选项,关闭窗口时,程序退出
        /*
        创建面板
        面板可以设置布局管理器
           1.流式布局
              组件在面版上从左到右排列,一行占满重新换行  不影响组件大小
                 JPanel jPanel=new JPanel(new FlowLayout());//设置流水布局,默认水平居中,上下左右为5个像素间距
                   JPanel jPanel=new JPanel(new FlowLayout(FlowLayout.LEFT));//设置流水布局居左对齐
                   JPanel jPanel=new JPanel(new FlowLayout(FlowLayout.LEFT,20,50));//设置流水布局居左对齐,设置间距
            2.边界布局
                  上北 下南 左西  右东  中间(不能少的)
                   JPanel jPanel=new JPanel(new BorderLayout());
            3.网格布局
                   设置行 列
                    JPanel jPanel=new JPanel(new GridLayout(4, 1));//
         */
        JPanel jPanel = new JPanel(new GridLayout(4, 1));//
        JButton jButton1 = new JButton("登录");
        JButton jButton2 = new JButton("注册");
        JPanel jPanel1 = new JPanel(new FlowLayout(FlowLayout.CENTER));
        JPanel jPanel2 = new JPanel(new FlowLayout(FlowLayout.CENTER));
        JPanel jPanel3 = new JPanel(new FlowLayout(FlowLayout.CENTER));
        JPanel jPanel4 = new JPanel(new FlowLayout(FlowLayout.CENTER, 40, 5));
        JLabel jLabel1 = new JLabel("欢迎来到新手村");
        jLabel1.setFont(new Font("楷体", Font.BOLD, 20));
        JLabel jLabel2 = new JLabel("账号");
        //创建输入框组件
        JTextField jTextField = new JTextField(15);
        JLabel jLabel3 = new JLabel("密码");
        //创建密码框
        JPasswordField jPasswordField = new JPasswordField(15);
        jPanel1.add(jLabel1);
        jPanel.add(jPanel1);
        jPanel2.add(jLabel2);
        jPanel2.add(jTextField);
        jPanel.add(jPanel2);
        jPanel3.add(jLabel3);
        jPanel3.add(jPasswordField);
        jPanel.add(jPanel3);
        jPanel4.add(jButton2);
        jPanel4.add(jButton1);
        jPanel.add(jPanel4);

        this.add(jPanel);
        this.setVisible(true);//让窗口显示出来,放在设置的最后一行

        jButton1.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                String account = jTextField.getText();
                String password = new String(jPasswordField.getPassword());
                if (account.length() == 0) {
                    JOptionPane.showMessageDialog(null, "请输入账号");
                } else if (password.length() == 0) {
                    JOptionPane.showMessageDialog(null, "请输入密码");
                } else if (!(jTextField.getText().matches("[0-9A-Za-z]+"))) {
                    JOptionPane.showMessageDialog(null, "账号应由数字与字母组成");
                } else if (!(password.matches("[0-9A-Za-z]+"))) {
                    JOptionPane.showMessageDialog(null, "密码应由数字与字母组成");
                }
                new Messagaefarm();
                dispose();
            }
        });

    }

    public static void main(String[] args) {
        new Longinfarm();//创建窗口
    }
}

 

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class Messagaefarm extends JFrame {
    public Messagaefarm() {
        this.setSize(1000, 700);//设置窗口大小
        this.setTitle("10086新手村");//设置标题
        //this.setLocation(600, 300);//设置窗口位置
        this.setLocationRelativeTo(null);//设置窗口水平垂直剧中
        this.setResizable(false);//设置窗口不可以调整大小
        this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
        //创建面版
        JPanel jPanel = new JPanel(new BorderLayout());
        JPanel jPanel2 = new JPanel(new BorderLayout());
        JButton jButton = new JButton("发送");
        JTextArea jTextArea = new JTextArea(8, 60);
        JPanel jPanel1 = new JPanel(new FlowLayout());
        JTextArea jtarea=new JTextArea();
        jtarea.setEnabled(false);
        JScrollPane jScrollPane1=new JScrollPane(jtarea);
        jPanel1.add(new JTextArea(6, 70));
        JScrollPane jScrollPane = new JScrollPane(jTextArea);
        jPanel1.add(jButton);
        jPanel2.add(jScrollPane1);
        jPanel.add(jPanel1, BorderLayout.SOUTH);
        jPanel.add(jPanel2, BorderLayout.CENTER);

        this.add(jPanel);
        this.setVisible(true);
        jButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                String mess = jTextArea.getText();
                if (mess.length() == 0) {
                    JOptionPane.showMessageDialog(null, "无法发送空内容");
                }
            }
        });
        this.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                int res=JOptionPane.showConfirmDialog(null, "您确定要退出吗","操作提示",JOptionPane.OK_CANCEL_OPTION);
                if(res==0){
                    new Longinfarm();
                    dispose();
                }
            }
        });
    }


    public static void main(String[] args) {
        new Messagaefarm();
    }
}

对话框

JOptionPane对话框      

 showMessageDialog():消息对话框 

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

   ERROR_MESSAGE                     错误消息提示   

   INFORMATION_MESSAGE      信息提示   

   WARNING_MESSAGE               警告提示   

   QUESTION_MESSAGE              问题提示    

   PLAIN_MESSAGE                       简洁提示

showConfirmDialog():确认对话框 

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

    DEFAULT_OPTION                   默认选项   

    YES_NO_OPTION                    是/否选项   

   YES_NO_CANCEL_OPTION   是/否/取消选项  

    OK_CANCEL_OPTION             确定/取消

 this.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                int res=JOptionPane.showConfirmDialog(null, "您确定要退出吗","操作提示",JOptionPane.OK_CANCEL_OPTION);
                if(res==0){
                    new Longinfarm();
                    dispose();
                }
            }
        });

  • 24
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值