目录
GUI(Graphical User Interfase)图形用户界面。
图形用户界面是一种人与计算机互动的界面显示格式,允许用户使用鼠标等输入设备操纵屏幕上的图标或菜单选项,以选择命令、调用文件、启动程序或执行其它一些日常任务。与通过键盘输入文本或字符命令来完成例行任务的字符界面相比,图形用户界面有许多优点。图形用户界面由窗口、下拉菜单、对话框及其相应的控制机制构成,在各种新式应用程序中都是标准化的,即相同的操作总是以同样的方式来完成,在图形用户界面,用户看到和操作的都是图形对象,应用的是计算机图形学的技术。
描述Swing和容器组件
Swing是java组件,里面大部分组件类位于javax.swing包中。
java图形界面基本组合是组件,组件是一个以图形展示并且能与用户交互的对象。
组件不能独立显示出来,必须放在容器中,一个容器可以容纳多个组件,通过容器.add()方法添加组件。
常用容器
常用容器:窗口Frame和面板Panel
JFrame 在Swing程序中创建窗体;
JFrame 构造方法:
JFrame() 窗体初始不可见,无参
JFrame(String title)窗体初始不可见,有参,可以设置title标题
Jpanel 提供面板
面板中也可以添加其他组件,亦可以设置布局,还可布局嵌套
Jpanel () 创建一个空面板
Jpanel (LayoutManager layout) 创建一个空面板,且有指定布局
常用方法:
this.setTitle("标题");//窗口标题
this.setSize(500, 500);//设置窗口大小
this.setLocation(300, 500);//设置窗口位置(坐标)
this.setLocationRelativeTo(null);//设置窗口相对显示器居中
this.setResizable(false);//禁止设置窗口大小
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//关闭窗口
this.add(jButton);//添加方法
this.setVisible(true);//显示窗口
jLabel.setFont(new Font("楷体", Font.BOLD,20));//设置字体 楷体 加黑 大小20
jPanel.setBackground(new Color(170, 165, 130));//设置颜色
JTextArea jTextArea = new JTextArea(31,65);
JScrollPane jScrollPane = new JScrollPane(jTextArea);//设置多行文本滚动条
GUI布局管理
在Java中,每个jpanel都有一个布局管理器对象,并且在布局管理上,采用容器和布局管理相分离的方案,Java中有几种常用的布局管理器,分别是:流式布局FlowLayout , 边界布局BorderLayout, 网格布局GridLayout。
(1)流式布局FlowLayout
这个布局会将组件按从左到右,从上到下的顺序来安排,并默认居放置,FlowLayout布局管理器对组件逐行定位,行内从左到右,一行排满后换行,不改变组件的大小,按组件原有尺寸显示组件,可设置不同的组件间距,行距以及对齐方式。
new FlowLayout(FlowLayout.RIGHT,20,40); //右对齐,组件之间水平间距20个像素,垂直间距40个像素。 this.add(new Button("确定"));//添加按钮
(2) 边界布局BorderLayout
BorderLayout 将整个容器的布局划分成东( EAST )西( WEST )南( SOUTH )北( NORTH )中 (CENTER )五个区域,组件只能被添加到指定的区域。this.add(new Button(“按钮”) ,BorderLayout.NORTH); //将按钮添加到上面的区域里 this.add(new Button(“按钮”) ,BorderLayout.CENTER);//将按钮添加到中间的区域里
● 如不指定组件的加入部位,则默认加入到 CENTER 区。● 每个区域只能加入一个组件,如加入多个,则先前加入的会被覆盖。● BorderLayout 型布局容器尺寸缩放原则:● 北、南两个区域在水平方向缩放。● 东、西两个区域在垂直方向缩放。● 中部可在两个方向上缩放。
(3) 网格布局GridLayout
网格布局中是一块一块大小相等的网格,组件会放置在网格中,组件随着网格的大小而在水平和垂直方向上拉伸,网格的大小是由容器的 大小和创建网格的多少来确定的。
this.setLayout(new GridLayout(2 , 3)); //创建一个2行3列的网格 this.add(new Button(“按钮”));//添加按钮
当组件数目大于网格数时, GridLayout 保持行数不变而自动增加列数。● GridLayout 型布局管理器将空间划分成规则的矩形网格,每个单元格区域大小相等。组件被添加到每个单元格中,先从左到右添满一行后换行,再从上到下。● 在 GridLayout 构造方法中指定分割的行数和列数
常用组件
标签(JLabel) 标签是容纳文本和图标的控件
JLabel jLabel = new JLabel("账 号");//创建标签&内容可为空
jLabel.setText();//设置标签内容
String s1 = jLabel.getText();//获取标签内容
单行文本框(JTextField)
JTextField jTextField = new JTextField(15);//设置单行文本框&可设置标题和列数
jPanel1.add(jTextField);//添加文本框到面板
jTextField.setText(String text); //设置内容
String s = jTextField.getText(); //获得内容
jTextField.setFont(new Font(“宋体”,Font.BOLD, 18)); //设置字体
多行文本框(JTextArea)
JTextArea jTextArea = new JTextArea(31,65);//设置多行文本域JScrollPane jScrollPane = new JScrollPane(jTextArea);//设置多行文本滚动条
jTextArea.setText(String text); //设置内容
String s = jTextArea.getText(); //获得内容
void setEditable(boolean b);// 设置文本框是否可以编辑
jTextArea.setFont(new Font(“宋体”,Font.BOLD, 18)); //设置字体
密码框(JPasswordField)
JPasswordField jPasswordField = new JPasswordField(15);//新建密码框
String s2 = jPasswordField.getPassword();//获取密码
按钮(JButton)
JButton jButton1 = new JButton("登录");//新建“登录”按钮
jButton1.setBackground(color);//设置按钮颜色
jButton1.setToolTipText("");//按钮悬停信息提示
菜单栏组件JMenuBar() 菜单组件JMenu(“菜单名称”) 菜单项组件JMenuItem(“菜单项名称”)
事件处理
事件处理对采用了图形用户界面的程序来说是非常重要的,图形界面要想实现功能,必须进行事件处理。
● Java中,事件处理的基本思路如下:● 一个源(事件源)产生一个事件(事件对象)并把它送到监听器那里,监听器只是简单地等待,直到它收到一个事件,一旦事件被接受,监听器将处理这些事件;● 一个事件源必须注册监听器以便监听器可以接受关于一个特定事件的通知。通俗举例:以按钮为例 按钮是事件源 监听器是 ActionListener。
添加事件监听器(此处为匿名类)
按钮对象.addActionListener(new ActionListener() { // 事件处理
@Override
public void actionPerformed(ActionEvent e) {
...执行操作...
} });
JButton jButton2 = new JButton("取消");
jButton2.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
jPasswordField.setText(null);//点击取消则置密码框内容为空
}
});
还有键盘监听 addKeyListener
对话框
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 确定 / 取消
jButton1.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {//鼠标按压事件
String s1 = jTextField.getText();
String s2 = jPasswordField.getText();
if (s1.length() == 0 || s2.length() == 0) {
JOptionPane.showMessageDialog(null, "账号密码不能为空", "错误", JOptionPane.WARNING_MESSAGE);
}
boolean b1 = s1.matches("([a-z]*[0-9]*)+");//正则表达式
boolean b2 = s2.matches("([a-z]*[0-9]*)+");
if (!b1 | !b2) {
JOptionPane.showMessageDialog(null, "账号密码只能由数字,字母组成", "错误", JOptionPane.WARNING_MESSAGE);
}
if(s1.equals("w123456") && s2.equals("w123456")){
dispose();//关闭窗口
new ChatWindow();//打开聊天界面
}
else JOptionPane.showMessageDialog(null, "账号或密码错误", "错误", JOptionPane.WARNING_MESSAGE);
}
});
内部类
什么是内部类?
● 把类定义在另一个类的内部,该类就被称为内部类。● 如果在类 Outer 的内部再定义一个类 Inner,此时类 Inner 就称为内部类(或称为嵌套类),而类 Outer 则称为外部类(或称为宿主类)。
将只在本类中使用的功能定义在内部类中,实现封装,在哪儿用就在那创建,内部类可使用外部类成员
内部类都有哪些
如果我们的内部类不想轻易被任何人访问,可以选择使用 private 修饰内部类,这样我们就无法通过创建对象的方法来访问,想要访问只需要在外部类中定义一个public修饰的方法,间接调用。这样做的好处就是,我们可以在这个 public 方法中增加一些判断语句,起到数据安全的作用。
内部类的特点
● 内部类仍然是一个独立的类,在编译之后内部类会被编译成独立的.class 文件,但是前面冠以外部类的类名和 $ 符号。● 内部类不能用普通的方式访问。内部类是外部类的一个成员,因此内部类可以自由地访问外部类的成员变量,无论是否为 private 的。● 内部类声明成静态的,就不能随便访问外部类的成员变量,仍然是只能访问外部类的静态成员变量
内部类作用
1.每个内部类都能独立的继承一个接口的实现,所以无论外部类是否已经继承了某个(接口的)实现,对于内部类都没有影响。内部类解决了多继承。
2.方便将存在一定逻辑关系的类组织在一起,又可以对外界隐藏,封装性好。
3.方便编写事件驱动程序和线程代码。