前言
Java通过AWT实现GUI
窗口
创建窗口对象
1
| Frame frame = new Frame();
|
创建窗口对象时指定窗口标题
1
| Frame frame = new Frame("窗口标题");
|
窗口对象的实例方法
修改窗口设置
设置窗口可见性
false:缺省值,不可见
true:可见
设置窗口标题
设置窗口位置
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
| String title = frame.getTitle();
|
获取窗口尺寸
1 2
| int width = frame.getWidth(); int height = frame.getHeight();
|
关闭窗口并退出进程
添加窗口事件监听器
监听窗口打开事件
- 窗口可见性设置为
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(); } });
|
监听窗口关闭事件
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 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 2
| GridLayout gridLayout = new GridLayout(<row>, <column>); frame.setLayout(gridLayout);
|
组件
面板
1 2
| Panel panel = new Panel(); frame.add(panel);
|
滚动面板
1 2
| ScrollPane scrollPane = new ScrollPane(); frame.add(scrollPane);
|
面板添加组件
标签
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);
|
获取多选框状态
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.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);
|
菜单项添加快捷键
1
| menuItem.setShortcut(new MenuShortcut('A'));
|
- 第二个参数为
true时,需要按Ctrl(Command)+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();
|
获取选择的文件
自定义组件
- 创建一个继承
Component类的子类,重写paint(Graphics g)方法
1 2 3 4 5 6
| Class Cls extends Component { @Override public void paint(Graphics g) { ... } }
|
设置画笔颜色
绘制填充图形
绘制矩形
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);
|
完成
参考文献
哔哩哔哩——青空の霞光