GUI简单介绍
java.awt:Abstract Window ToolKit(抽象窗口工具包),需要调用本地系统方法实现功能
javax.swing:在AWT基础上建立的一套工具包,移植性更强
java GUI几种技术选择
AWT:java最早的界面库
Swing:对AWT的扩展,轻量级设计的界面库
JavaFX:java1.8之后出现的界面库
SWT:Eclipse所使用的界面库,由Eclipse管理
GUI体系结构图
Container:容器,是一个特殊的组件,该组件中可以通过add方法添加其他组件在容器。
窗体布局
窗体中组件的排列方式,常用的布局方式:
流式布局:从左到右,从上到下(也可以自定义),对齐方式有:
FlowLayout.LEFT左对齐、FlowLayout.RIGHT右对齐、FlowLayout.GENTER中间对齐,默认使用左对齐
构造方法 | 方法功能 |
---|---|
FlowLayout() | 使用默认的对齐方式及默认的垂直间距、水平间距创建FlowLayout布局管理器 |
FlowLayout(int align) | 使用指定的对齐方式及默认的垂直间距、水平间距创建FlowLayout布局管理器 |
FlowLayout(int align,int hgap,int vgap) | 使用指定的对齐方式及指定的水平间距,垂直间距创建FlowLayout布局管理器 |
边界布局:分为东、西、南、北、中五个方向
网格布局:有行列之分
网格包布局:不规则
卡片布局:每个按钮不同事件
流式布局示例:
public static void main(String[] args) {
Frame frame = new Frame("新窗体测试");
//设置布局
frame.setBounds(500,400,400,300);
frame.setLayout(new FlowLayout());
//创建文本输入窗
TextField tf = new TextField();
//创建按钮
Button bu = new Button("按钮1");
//创建一个文本域
TextArea ta = new TextArea();
//将元素添加到主容器中
frame.add(tf);
frame.add(bu);
frame.add(ta);
//添加按钮点击事件
bu.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent actionEvent) {
//获取文本信息
String trim = tf.getText().trim();
//清理输入空间
tf.setText("");
//设置文本域
// ta.setText(trim);
ta.append(trim);
//获取焦点
tf.requestFocus();
}
});
//关闭窗口事件
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent windowEvent) {
System.exit(0);
}
});
frame.setVisible(true);
}
鼠标的相关事件:
public static void main(String[] args) {
Frame frame = new Frame("新窗体测试");
//设置布局
frame.setBounds(400,200,500,400);
frame.setLayout(new FlowLayout());
JButton btn1 = new JButton("按钮点击事件");
JButton btn2 = new JButton("鼠标点击事件");
JButton btn3 = new JButton("鼠标进入事件");
JButton btn4 = new JButton("鼠标退出事件");
frame.add(btn1);
frame.add(btn2);
frame.add(btn3);
frame.add(btn4);
//按钮改变事件
btn1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent actionEvent) {
frame.setBackground(Color.RED);
}
});
//对按钮添加鼠标事件
btn2.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent mouseEvent) {
frame.setBackground(Color.GREEN);
}
});
btn3.addMouseListener(new MouseAdapter() {
@Override
public void mouseEntered(MouseEvent mouseEvent) {
frame.setBackground(Color.YELLOW);
}
});
btn4.addMouseListener(new MouseAdapter() {
@Override
public void mouseExited(MouseEvent mouseEvent) {
frame.setBackground(Color.WHITE);
}
});
//关闭窗口事件
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent windowEvent) {
System.exit(0);
}
});
frame.setVisible(true);
}
键盘事件
public static void main(String[] args) {
Frame frame = new Frame("键盘监听事件示例");
frame.setBounds(400,200,500,400);
frame.setLayout(new FlowLayout());
//创建label对象,并且label不能输入非数字字符
JLabel label = new JLabel("请输入手机号,不能为非数字字符");
TextField tf = new TextField(40);
frame.add(label);
frame.add(tf);
tf.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent keyEvent) {
//当前键盘按键为非数字字符,设置取消事件
char keyChar = keyEvent.getKeyChar();
if(!(keyChar>='0'&&keyChar<='9')){
keyEvent.consume();
}
}
});
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent windowEvent) {
System.exit(0);
}
});
frame.setVisible(true);
}
菜单组件
MenuBar、Menu、Menultem
先创建菜单条,再创建菜单,每一个菜单中建立菜单项。也可以将菜单添加到菜单中充当子菜单,通过setMenuBar方法,将菜单添加到Frame中
public static void main(String[] args) {
JFrame frame = new JFrame("创建菜单窗体");
//设置布局以及窗体大小
frame.setBounds(400,200,500,400);
frame.setLayout(new FlowLayout());
//创建菜单栏
JMenuBar mb = new JMenuBar();
//创建菜单
JMenu m1 = new JMenu("打开文件");
JMenu m2 = new JMenu("切换目录");
JMenu m3 = new JMenu("审阅文件");
JMenu m11 = new JMenu("更改名称");
JMenu m12 = new JMenu("打开记事本");
//创建菜单项
JMenuItem mi1 = new JMenuItem("好好学习");
JMenuItem mi2 = new JMenuItem("天天向上");
JMenuItem mi4 = new JMenuItem("恢复标题");
JMenuItem mi3 = new JMenuItem("退出系统");
//菜单栏添加菜单或者菜单项
m1.add(mi1);
m1.add(m11);
m1.add(m12);
m1.add(mi3);
m11.add(mi1);
m11.add(mi2);
m11.add(mi4);
//导航栏添加
mb.add(m1);
mb.add(m2);
mb.add(m3);
//设置菜单栏
frame.setJMenuBar(mb);
//打开记事本
m12.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent actionEvent) {
Runtime r = Runtime.getRuntime();
try{
r.exec("notepad");
}catch(Exception ex){
ex.printStackTrace();
}
}
});
//菜单项添加监听事件
mi3.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent actionEvent) {
System.exit(0);
}
});
//关闭事件
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent windowEvent) {
System.exit(0);
}
});
//设置窗体可见
frame.setVisible(true);
}
Swing
Swing是基于AWT的,是使用J开头的相关的控件。
使用lambda表达式对按钮事件进行处理
窗体布局类
public class MyFrame extends JFrame {
JLabel timelabel = new JLabel("00:00:00");
JButton button = new JButton("显示时间");
public MyFrame() {
}
public MyFrame(String name) {
super(name);
Container contain = getContentPane();
contain.setLayout(new FlowLayout());
// 内容面板,向内容面
contain.add(button);
contain.add(timelabel);
//事件监听接口,只有一个方法,因此使用lambda实现接口方法
button.addActionListener((e) -> {
showTime();
});
}
public void showTime() {
SimpleDateFormat simple = new SimpleDateFormat("yyyy:MM:dd HH:mm:ss");
timelabel.setText(simple.format(new Date()));
}
}
主启动类
public class GetSomeWindow {
public static void createGui() {
MyFrame frame = new MyFrame("Hello,Xing");
frame.setBounds(500, 400, 600, 400);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
//相当于传递一个线程,使用lambda启动线程
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
createGui();
});
}
}
回调:Callback,设计上的术语,当调用系统一个方法时,称为调用Call,当一个方法被系统调用时,称为回调Callback
JLabel用于显示段文本或者图标
setText()设置文本
setFont()设置字体
setForeground()设置文本颜色
setToolTipText()设置工具提示
JTextField,用于显示单行文本
new JTextField(16),16表示列数,用于计算宽度
setText()/getText() 设置文本域文字/获取文本域文字
setFont() 设置字体
JCheckBox复选框
getSelected()/setSelected() 选中状态/设置
setText()选项文字
事件:addActionListener()用户选中/取消时触发
JComboBox下拉列表