core java---day13(GUI)
复习:
面向对象编程:类,对象和方法的使用
包装器:把基本数据类型包装为引用数据类型 提供方法
注解:标识功能
反射:Student.class
Student stu = new Student();
stu.getclass();
class.forName("全限定名");
断言:辅助测试
测试阶段有效,运行时无效
-ea :开启断言(需要虚拟机参数:windows--》perfences--》java--》install jar--》选中--》edit--》vm的空格里写入-ea)
assert boolean 表达式
if(boolean表达式)
一. java.AWT
javax.swing
图形用户界面(Graphics User Interface, GUI)
是用户与程序交互的窗口,
它比基于命令行的界面更直观并且更友好。
GUI的基本类库位于java.awt包中,
这个包也被称为抽象窗口工具箱
(Abstract Window Toolkit, AWT)。AWT按照面向
对象的思想来创建GUI
它提供了容器类、
众多的组件类和布局管理器类.
AWT构建图形用户界面的机制包括:
. 提供了一些容器组件(如Frame和Panel), 用来容纳其他的组件(如按钮Button、复选框Checkbox和文本框TextField)。
. 用布局管理器来管理组件在容器上的布局;
. 利用监听器来响应各种事件,实现用户与程序的交互。一个组件如果注册了某种事件的监听器,由这个组件触发的
特定事件就会被监听器接收和响应;
二. 创建GUI 步骤一:选择一个窗口
java.awt包中提供了一个
抽象类Component,它是所有除了菜单类组件之外的AWT组件的父类。
Container类表示容器,继承了Component类。容器用来存放别的组件, 有两种类型的容器:Window和Panel。
1. Window和它的子类Frame
Window是不依赖于其他容器而独立存在的容器。Window有两个子类:Frame和Dialog。Frame带有标题,而且可以调整大
小。Dialog可以被移动,但是不能改变大小。
Frame是我们最常用的一种 窗口。
Frame有一个构造方法——Frame(String title),通过它可以创建一个以参数为标题的Frame对象。Frame的add()方法
向容器中加入其他组件。当Frame被创建后,它是不可见的,必须通过以下步骤使Frame成为可见的。
1) 设置大小 :
setSize(int width, int height)显示设置Frame的大小,或者调用
pack()方法自动确定Frame的大小。pack()方法会确保Frame容器中的组件都会有与布局相适应的合理大小。
setLocation();设置窗口的位置
*setBounds(x,y,宽,高);设置大小和位置
2) setVisible(true)方法使Frame成为可见的。
import java.awt.*;
public class SimpleFrame {
public static void main(String[] args) {
Frame f = new Frame("hello");
f.add(new Button("Press Me"));
f.setSize(100,100);
f.setVisible(true);
}
}
如果把f.add(new Button("Press Me"))语句移到f.setVisible(true)语句之后,再运行程序,将会发现Button没有被
显示。这是因为当执行f.setVisible(true)语句时,Frame按照其当时的状态显示界面,接下来添加或删除Frame中的
组件,Frame的形状是不会自动更新的,除非再调用f.validate()方法使容器重新布置界面;
2. Panel
Panel不能单独存在,只能存在于其他容器中(Window或其子类)中,它有一个子类Applet,Applet可以在Web浏览器的窗
口中运行。一个Panel对象代表了一个长方形的区域,在这区域中可以容纳其他的组件。
可以通过Panel类的默认构造方法来创建一个Panel对象,然后通过Panel的add()方法向Panel中添加组件。如果要使Panel
成为可见的,必须通过Frame或Window的add()方法把Panel添加到Frame或Window中。
import java.awt.*;
public class SimplePanel {
public static void main(String[] args) {
Frame f = new Frame("hello");
Panel p = new Panel();
p.add(new Button("press me"));
p.setBackground(Color.YELLOW);
f.add(p);
f.setSize(100,100);
f.setBackground(Color.BLUE);
f.setVisible(true);
}
}
三. 创建GUI 步骤二:布局管理器
组件在容器中的位置和尺寸是由布局管理器来决定的。所有的容器都会引用一个布局管理器实例,通过它来自动进行组件的
布局管理。
1. 默认布局管理器
当一个容器被创建后,它们有相应的默认布局管理器。Window、Frame和Dialog的默认布局管理器是BorderLayout, Panel
和Applet的默认布局管理器是FlowLayout。可以通过setLayout()方法来重新设置容器的布局管理器。例:
Frame f = new Frame("hello");
f.setLayout(new FlowLayout());
2. 取消布局管理器
如果不希望通过布局管理器来管理布局,可以调用容器的setLayout(null)方法,这样布局管理器就被取消了。
接下来必须调用容器中每个组件的setLocation(), setSize()或setBounds()方法,为这些组件在容器中一一定位。
和布局管理器管理方式不同的是,这种手工布局将导致图形界面的布局不再和平台无关的。相反,图形界面的布局将依赖
于操作系统环境。
import java.awt.*;
public class ManualLayout {
public static void main(String[] args) {
Frame f = new Frame("hello");
f.setLayout(null); //取消布局管理器
f.setSize(300,100); //宽300, 高100
Button b = new Button("press me");
b.setSize(100,30); //宽100, 高30
b.setLocation(40,60); //x坐标40, y坐标60
f.add(b);
f.setVisible(true);
}
}
3. 布局管理器种类
java.awt包提供了5种布局管理器:我们经常使用的是前四种管理器
a. FlowLayout流式布局管理器;
b. BorderLayout边界布局管理器;
c. GridLayout网格布局管理器;
d. CardLayout卡片布局管理器;
e. GridBagLayout 网格包布局管理器
javax.swing包提供了一种BoxLayout布局管理器:
四. 创建GUI 步骤三:在容器中加入组件
JButton 按钮
JLabel 标签(文本/图片)
JTable 表格
JComboBox<E> 下拉
JRadioButton 单选框
JCheckBox 复选框
JTextField 输入框
JPasswordField 密码框
JScrollPane 有滚动条的pane
ImageIcon 图片/图标
五. 创建GUI 步骤四:创建事件处理器
javax.swing.Timer 类
ActionListener 接口
KeyListener 接口
六. FlowLayout流式布局管理器
最简单的布局管理器,按照组件的添加次序将它们从左到右地放置在容器中。当到达容器边界时,组件将放置在下一行中。
FlowLayout允许以左对齐、居中对齐(默认方式)或右对齐的方式排列组件。特性:
. 不限制它所管理的组件的大小, 而是允许它们有自己的最佳大小。
. 当容器被缩放时,组件的位置可能会变化,但组件的大小不改变。
FlowLayout的构造方法如下:
. FlowLayout();
. FlowLayout(int align);
. FlowLayout(int align, int hgap, int vgap)
参数align用来决定组件在每行中相对于容器的边界的对齐方式,可选值有:
FlowLayout.LEFT 左对齐
FlowLayout.RIGHT 右对齐
FlowLayout.CENTER 居中对齐
参数hgap和参数vgap分别设定组件之间的水平和垂直间隙。
七. BorderLayout边界布局管理器
将容器分为五个区域:东、南、西、北和中。
特征:
. 东西区域的组件保持最佳宽度,高度被垂直拉伸至和所有区域一样高;
南北区域的组件保持最佳高度,宽度被水平拉伸至和所在区域一样宽;
位于中区域的组件的宽度和高度都被拉伸至和所在区域一样大小。
. 垂直拉伸,东、西和中区域也拉伸;
水平拉伸,南、北和中区域也拉伸;
. 中区域没有组件,也会分配空间显示容器的背景颜色;
其它区域没有组件,不会分配空间;
. 容器被缩放,组件所在的相对位置不变化,但组件大小改变;
. 某个区域添加的组件不止一个,则只有最后添加的一个是可见的;
构造方法:
. BorderLayout();
. BorderLayout(int hgap, int vgap);
参数hgap和参数vgap分别设定组件之间的水平和垂直间隙;
对于采用BorderLayout的容器,当它用add()方法添加一个组件时,可以同时为组件指定在容器中的区域。
void add(Component comp, Object constraints)
这里的constraints是String类型,可选值为BorderLayout提供的五个常量:
. BorderLayout.NORTH: 北区域,值为"North";
. BorderLayout.SOUTH: 南区域,值为"South";
. BorderLayout.EAST: 东区域,值为"East";
. BorderLayout.WEST: 西区域,值为"West";
. BorderLayout.CENTER: 北区域,值为"Center";
Frame的默认布局管理器就是BorderLayout。以下代码把Button放在Frame的北区域。
Frame f = new Frame("Test");
f.add(new Button("b1",BorderLayout.NORTH));
//或者:f.add(new Button("b1","North"));
如果不指定add()方法的constraints参数,在默认情况下把组件放在中区域。以下代码向Frame的中区域加入两个Button,
但只有最后加入的Button是可见的。
Frame f = new Frame("Test");
f.add(new Button("b1"));
f.add(new Button("b2"));
f.setSize(100,100);
f.setVisible(true);
package com.briup.ch13;
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.Frame;
import java.awt.Label;
import java.awt.Panel;
/**
* Gui 测试 3
* 布局
* */
public class Test5 extends Frame{
/**
* 初始化窗口<br>
* 向窗口中添加内容
* */
public void init() {
setTitle("student system");
//北面的容器
Panel pN = new Panel();
pN.setBackground(Color.orange);
//设置border 某个方向的 宽高
pN.setPreferredSize(new Dimension(1,100));//设置首选的大小
Label msg = new Label();
//设置msg的文本
msg.setText("student System");
//获取msg的文本
//String text = msg.getText();
Font font= new Font("宋体",Font.CENTER_BASELINE,36);
//给msg 设置字体
msg.setFont(font);
pN.add(msg);
this.add(pN,BorderLayout.NORTH);
Panel pw = new Panel();
pw.setBackground(Color.gray);
pw.setPreferredSize(new Dimension(100,1));
for(int i= 0;i<5;i++) {
Button but= new Button("Student "+i);
pw.add(but);
}
this.add(pw,BorderLayout.WEST);
Panel pc = new Panel();
//设置布局管理器
//FlowLayout fl = new FlowLayout(FlowLayout.CENTER);
//FlowLayout fl = new FlowLayout(FlowLayout.LEFT);
FlowLayout fl = new FlowLayout(FlowLayout.RIGHT,0,0);
pc.setLayout(fl);
pc.setBackground(Color.green);
for(int i= 0;i<100;i++) {
Button button = new Button(""+i);
if(i>60) {
//设置按钮不可用
button.setEnabled(false);
}
pc.add(button);
}
this.add(pc,BorderLayout.CENTER);
//设置窗口大小
setSize(new Dimension(500, 500));
//setSize(100, 100);
//设置窗口位置
setLocation(300, 200);
//设置不能被用户改变大小
setResizable(true);
//设置窗口在最上方显示,窗口置顶
setAlwaysOnTop(true);
//设置可见性
setVisible(true);
}
public static void main(String[] args) {
new Test5().init();
}
}
上一篇: Unity3D学习笔记————GUI
下一篇: JAVA--GUI:事件监听机制
推荐阅读
-
Fedora core 7(FC7)中成功安装Oracle10g
-
asp.net core实例教程之项目结构
-
.Net Core 项目发布到Linux - CentOS 7(二)用Supervisor守护netcore进程
-
C#/.NET/.NET Core定时任务调度的方法或者组件有哪些--Timer,FluentScheduler还是...
-
Asp.Net Core 轻松学-HttpClient的演进和避坑
-
Asp.Net Core + SignalR 实现实时通信
-
Asp.Net Core 轻松学-基于微服务的后台任务调度管理器
-
ASP.NET Core在支付宝小程序中使用signalR
-
Why ngx-uploader doesn't like to cooperate with .net core 2.x?
-
1.ASP.NET Core介绍