【笔记】Java的AWT

前言

Java通过AWT实现GUI

AWT(Abstract Window Toolkit)

窗口

创建窗口对象

1
Frame frame = new Frame();
创建窗口对象时指定窗口标题
1
Frame frame = new Frame("窗口标题");

窗口对象的实例方法

修改窗口设置
设置窗口可见性

false:缺省值,不可见
true:可见

1
frame.setVisible(true);
设置窗口标题
1
frame.setTitle("");
设置窗口位置
1
frame.setLocation(<x>, <y>);
设置窗口尺寸
1
frame.setSize(<width>, <height>);
1
frame.setSize(new Dimension(<width>, <height>));
同时设置窗口位置和窗口大小
1
frame.setBounds(<x>, <y>, <width>, <height>);
设置窗口背景颜色
1
frame.setBackground(new Color(255, 255, 255));
1
frame.setBackground(Color.WHITE);
设置窗口置顶

false:缺省值,窗口不置顶
true:窗口置顶

1
frame.setAlwaysOnTop(true);
设置窗口不允许改变尺寸

true:缺省值,允许改变尺寸
false:不允许改变尺寸

1
frame.setResizable(false);
设置光标
1
frame.setCursor();
获取窗口属性
获取窗口标题
1
String title = frame.getTitle();
获取窗口尺寸
1
2
int width = frame.getWidth();
int height = frame.getHeight();
关闭窗口并退出进程
1
frame.dispose();
添加窗口事件监听器
监听窗口打开事件
  • 窗口可见性设置为true时执行的事件
  • 监听器先监听,然后修改窗口可见性,才会触发事件
1
2
3
4
5
6
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowOpened(WindowEvent e) {
...
}
});
监听窗口关闭按钮
1
2
3
4
5
6
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
frame.dispose();
}
});
监听窗口关闭事件
  • 窗口执行dispose()方法之后才触发事件
1
2
3
4
5
6
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowOpened(WindowEvent e) {
...
}
});
监听窗口最小化按钮
1
2
3
4
5
6
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowIconified(WindowEvent e) {
...
}
});
监听窗口还原最小化事件
1
2
3
4
5
6
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowDeiconified(WindowEvent e) {
...
}
});
监听窗口获取焦点事件
  • 窗口每次获取焦点都会触发事件
1
2
3
4
5
6
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowActivated(WindowEvent e) {
...
}
});
监听窗口失去焦点事件
  • 窗口每次失去都会触发事件
1
2
3
4
5
6
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowDeactivated(WindowEvent e) {
...
}
});
添加键盘事件监听器
  • 按键按下事件=>按键输入事件=>按键抬起事件
监听按键输入事件
1
2
3
4
5
6
frame.addKeyListener(new KeyAdapter() {
@Override
public void keyTyped(KeyEvent e) {
...
}
});
监听按键按下事件
1
2
3
4
5
6
frame.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
...
}
});
监听按键抬起事件
1
2
3
4
5
6
frame.addKeyListener(new KeyAdapter() {
@Override
public void keyReleased(KeyEvent e) {
...
}
});
键盘事件(KeyEvent)实例方法
  • 获取按键字符
1
char keyChar = e.getKeyChar();
  • 获取按键键码值
1
int keyCode = e.getKeyCode();
添加鼠标事件监听器
监听鼠标按键点击事件
  • 左键按下事件=>(快速)=>左键释放事件
1
2
3
4
5
6
frame.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
...
}
});
监听鼠标按键按下事件
1
2
3
4
5
6
frame.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
...
}
});
监听鼠标按键抬起事件
1
2
3
4
5
6
frame.addMouseListener(new MouseAdapter() {
@Override
public void mouseReleased(MouseEvent e) {
...
}
});
监听鼠标进入窗口事件
  • 无论窗口是否是焦点,都会触发事件
1
2
3
4
5
6
frame.addMouseListener(new MouseAdapter() {
@Override
public void mouseEntered(MouseEvent e) {
...
}
});
监听鼠标移出窗口事件
  • 无论窗口是否是焦点,都会触发事件
1
2
3
4
5
6
frame.addMouseListener(new MouseAdapter() {
@Override
public void mouseExited(MouseEvent e) {
...
}
});
鼠标事件(MouseEvent)实例方法
  • 获取鼠标相对于屏幕的坐标
1
Point point = e.getLocationOnScreen();
1
2
int x = e.getXOnScreen();
int y = e.getYOnScreen();
  • 获取鼠标相对于窗口的坐标
1
Point point = e.getPoint();
1
2
int x = e.getX();
int y = e.getY();
  • 获取按键点击次数

  • 如果被点击了多次,会依次得到次数

    • 比如点击3次,会依次得到1、2、3,而不是只得到3
1
int clickCount = e.getClickCount();
  • 获取被点击的按键

返回值

1:左键
2:中键
3:右键
4:滚轮

1
int button = e.getButton();

设置全局字体

1
frame.setFont(new Font("宋体", Font.PLAIN, 12));

设置图标

1
2
3
Image image = ImageIO.read(new File("icon.png"));

frame.setIconImage(image);
设置MacOS的Dock栏图标
1
2
3
Image image = ImageIO.read(new File("icon.png"));

Application.getApplication().setDockIconImage(image);

自定义窗口修饰

取消操作系统默认窗口修饰
1
frame.setUndecorated(true);
定义窗口形状
圆角矩形
1
frame.setShape(new RoundRectangle2D.Double(0, 0, frame.getWidth(), frame.getHeight(), 10, 10));

布局

默认布局

  • 默认布局所有组件尺寸与窗口相同

空布局

1
frame.setLayout(null);

边界布局

  • 默认有东、南、西、北、中五个位置,添加组件时需要指定位置
1
2
BorderLayout borderLayout = new BorderLayout();
frame.setLayout(borderLayout);
顶部
左侧 中间 右侧
底部
组件设置位置
1
2
3
4
5
frame.add(<component>, BorderLayout.CENTER);
frame.add(<component>, BorderLayout.NORTH);
frame.add(<component>, BorderLayout.SOUTH);
frame.add(<component>, BorderLayout.WEST);
frame.add(<component>, BorderLayout.EAST);
设置组件间横向间距
1
borderLayout.setHgap(<size>);
设置组件间纵向间距
1
borderLayout.setVgap(<size>);

流式布局

  • 默认从左向右排列,只有一行,默认每行居中,每个组件之间有间距
  • 窗口尺寸改变时,一行展示不下的组件会被挤到下一行,继续从左向右排列
1
2
FlowLayout flowLayout = new FlowLayout();
frame.setLayout(new FlowLayout());
设置组件间横向间距
1
flowLayout.setHgap(<size>);
设置组件间纵向间距
1
flowLayout.setVgap(<size>);
设置对齐

<align>:对齐规则

FlowLayout.CENTER:缺省值,居中
FlowLayout.LEFT:居左
FlowLayout.RIGHT:居右

1
flowLayout.setAlignment(<align>);

卡片布局

  • 添加组件时,默认叠放所有组件
1
2
CardLayout cardLayout = new CardLayout();
frame.setLayout(cardLayout);
切换组件
1
cardLayout.next(frame);

网格布局

  • 添加组件时,从左向右、从上向下依次放入网格中
1
2
GridLayout gridLayout = new GridLayout(<row>, <column>);
frame.setLayout(gridLayout);

组件

  • AWT中组件默认位置为包含窗口标题的窗口左上角

面板

  • 存放组件的组件
    • 面板也是组件,面板中也可以放面板
  • 面板也是容器,也可以设置布局
1
2
Panel panel = new Panel();
frame.add(panel);
滚动面板
1
2
ScrollPane scrollPane = new ScrollPane();
frame.add(scrollPane);
面板添加组件
1
panel.add(<component>);

标签

1
2
3
Label label = new Label("标签");
label.setBounds(<x>, <y>, <width>, <height>);
frame.add(label);
设置字体
1
label.setFont(new Font("宋体", Font.PLAIN, 12));
设置前景色
1
label.setForeground(Color.RED);
设置背景色
1
label.setBackground(Color.RED);

按钮

1
2
3
Button button = new Button("按钮");
button.setBounds(<x>, <y>, <width>, <height>);
frame.add(button);
添加按钮事件监听器
监听按钮点击事件
1
2
3
4
5
6
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
...
}
});

文本框

1
2
3
TextField textField = new TextField("默认值");
textField.setBounds(<x>, <y>, <width>, <height>);
frame.add(textField);
获取文本框内容
1
String text = textField.getText();
设置显示字符
1
textField.setEchoChar('*');

文本域

1
2
3
TextArea textArea = new TextArea("默认值");
textArea.setBounds(<x>, <y>, <width>, <height>);
frame.add(textArea);
获取文本域内容
1
String text = textArea.getText();

选框

1
2
3
Checkbox checkbox = new Checkbox("选项");
checkbox.setBounds(<x>, <y>, <width>, <height>);
frame.add(checkbox);
获取多选框状态
  • 被选中返回true,未被选中返回false
1
boolean selected = checkbox.getState();
选框组
  • 通过选框组将多个选框关联起来,只允许组内其中一个选框被选中
1
2
3
4
5
6
Checkbox checkbox1 = new Checkbox("选项");
Checkbox checkbox2 = new Checkbox("选项");
CheckboxGroup checkboxGroup = new CheckboxGroup();

checkbox1.setCheckboxGroup(checkboxGroup);
checkbox2.setCheckboxGroup(checkboxGroup);
获取被选中的选框
1
Checkbox selectedCheckbox = checkboxGroup.getSelectedCheckbox();

列表

1
2
List list = new List();
frame.add(list);
添加列表项
  • 列表项只能是字符串类型
1
list.add("列表项");
设置允许多选
1
list.setMultipleMode(true);
获取已选中列表项
1
String[] selectedItems = list.getSelectedItems();
添加列表事件监听器
监听列表项改变事件
1
2
3
4
5
6
list.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
...
}
});

菜单栏

1
2
MenuBar menuBar = new MenuBar();
frame.add(menuBar);
菜单栏添加菜单
1
2
Menu menu = new Menu("菜单");
menuBar.add(menu);
菜单添加菜单项
1
2
MenuItem menuItem = new MenuItem("菜单项");
menu.add(menuItem);
添加可勾选菜单项
1
2
CheckboxMenuItem checkboxMenuItem = new CheckboxMenuItem("可勾选菜单项");
menu.add(checkboxMenuItem);
菜单项添加快捷键
  • 默认为CtrlCommand)+指定字符
1
menuItem.setShortcut(new MenuShortcut('A'));
  • 第二个参数为true时,需要按CtrlCommand)+Shift+指定字符
1
menuItem.setShortcut(new MenuShortcut('A', true));
添加菜单项事件监听器
监听菜单项点击事件
  • 无论是鼠标点击还是快捷键触发,都会触发此监听器
1
2
3
4
5
6
menuItem.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
...
}
});

弹出菜单(右键菜单)

1
2
PopupMenu popupMenu = new PopupMenu();
frame.add(popupMenu);
弹出菜单添加菜单项
1
2
MenuItem menuItem = new MenuItem("菜单项");
popupMenu.add(menuItem);
显示弹出菜单
  • 指定基于哪个组件上显示,以及相对于组件的显示位置
1
popupMenu.show(frame, <x>, <y>);
添加菜单项事件监听器

传送门

对话框

1
Dialog dialog = new Dialog(frame, "对话框");
  • 第三个参数为true表示对话框弹出后,依赖的窗口(第一个参数)不可聚焦
1
Dialog dialog = new Dialog(frame, "对话框", true);
设置对话框可见性
1
dialog.setVisible(true);
添加对话框事件监听器
监听对话框关闭事件
1
2
3
4
5
6
dialog.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
dialog.dispose();
}
});

文件选择对话框

1
FileDialog fileDialog = new FileDialog(frame, "文件选择对话框");
设置对话框可见性
1
fileDialog.setVisible(true);
获取选择的目录
1
fileDialog.getDirectory();
获取选择的文件
1
fileDialog.getFile();

自定义组件

  • 创建一个继承Component类的子类,重写paint(Graphics g)方法
1
2
3
4
5
6
Class Cls extends Component {
@Override
public void paint(Graphics g) {
...
}
}
设置画笔颜色
1
g.setColor(Color.RED);
绘制填充图形
绘制矩形
1
g.fillRect(<x>, <y>, <width>, <height>);
绘制文本
1
g.drawString("文本内容", <x>, <y>);
绘制图片
1
2
3
Image image = ImageIO.read(new File("image.png"));

g.drawImage(image, <x>, <y>, <width>, <height>);

组件的建议尺寸

  • 在布局没有强制要求尺寸的情况下会采用组件的建议尺寸
1
button.setPreferredSize(new Dimension(<width>, <height>));

获取所有字体数组

1
Font[] fonts = GraphicsEnvironment.getLocalGraphicsEnvironment().getAllFonts();

获取屏幕尺寸

1
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();

光标

内置光标

默认光标

1
Cursor cursor = Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR);

准星光标

1
Cursor cursor = Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR);

文本光标

1
Cursor cursor = Cursor.getPredefinedCursor(Cursor.TEXT_CURSOR);

等待光标

1
Cursor cursor = Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR);

西南方向缩放光标

1
Cursor cursor = Cursor.getPredefinedCursor(Cursor.SW_RESIZE_CURSOR);

东南方向缩放光标

1
Cursor cursor = Cursor.getPredefinedCursor(Cursor.SE_RESIZE_CURSOR);

西北方向缩放光标

1
Cursor cursor = Cursor.getPredefinedCursor(Cursor.NW_RESIZE_CURSOR);

东北方向缩放光标

1
Cursor cursor = Cursor.getPredefinedCursor(Cursor.NE_RESIZE_CURSOR);

北方向缩放光标

1
Cursor cursor = Cursor.getPredefinedCursor(Cursor.N_RESIZE_CURSOR);

南方向缩放光标

1
Cursor cursor = Cursor.getPredefinedCursor(Cursor.S_RESIZE_CURSOR);

西方向缩放光标

1
Cursor cursor = Cursor.getPredefinedCursor(Cursor.W_RESIZE_CURSOR);

东方向缩放光标

1
Cursor cursor = Cursor.getPredefinedCursor(Cursor.E_RESIZE_CURSOR);

手光标

1
Cursor cursor = Cursor.getPredefinedCursor(Cursor.HAND_CURSOR);

移动光标

1
Cursor cursor = Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR);

完成

参考文献

哔哩哔哩——青空の霞光