GUI编程
GUI是什么?
图形用户界面(Graphical User Interface,简称 GUI,又称图形用户接口)是指采用图形方式显示的计算机操作用户界面。 [1] 图形用户界面是一种人与计算机通信的界面显示格式,允许用户使用鼠标等输入设备操纵屏幕上的图标或菜单选项,以选择命令、调用文件、启动程序或执行其它一些日常任务。
组件
- 窗口
- 弹窗
- 面板
- 文本框
- 列表框
- 按钮
- 图片
- 监听事件
- 鼠标
- 键盘事件
1. 简介
GUI的核心技术: swing,AWT 这些并不流行
- 界面不美观
- 学院jre环境!
- 学习GUI有助于了解MVC架构,了解监听
- 学习GUI可以写出一下小工具
2. AWT
2.1 AWT介绍
- 包含很多类和接口
- 元素: 窗口,按钮,文本框
2.2 组件与容器
2.3 Frame
import java.awt.*;
public class Student {
public static void main(String[] args) {
Frame frame = new Frame("我的第一个窗口");
//设置窗口可见性
frame.setVisible(true);
//设置窗口大小
frame.setSize(300, 500);
//设置窗口背景颜色
frame.setBackground(Color.RED);
//设置窗口开始出现的位置默认是屏幕左上角坐标为(0,0)
frame.setLocation(200, 400);
//设置是否窗口大小固定
frame.setResizable(false);
}
}
2.4 面板Panel
使用监听解决了窗口无法关闭问题
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class Student {
//Panel面板可以看成是一个空间,面板不能单独存在
public static void main(String[] args) {
Frame frame = new Frame();
//布局的概念
Panel panel = new Panel();
//设置布局
frame.setLayout(null);
//坐标
frame.setBounds(200, 200, 300, 500);
//设置颜色
frame.setBackground(Color.cyan);
//设置panel坐标,相对于frame
panel.setBounds(50, 50, 100, 300);
panel.setBackground(Color.red);
//把面板添加到Frame上
frame.add(panel);
frame.setVisible(true);
//添加一个窗口监听事件
frame.addWindowListener(new WindowAdapter() {
@Override
//窗口关闭时干嘛
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
}
2.5 布局管理器
-
流式布局(从左到右)
public class Student { public static void main(String[] args) { Frame frame = new Frame(); Button button1 = new Button("button1"); Button button2 = new Button("button2"); Button button3 = new Button("button3"); Button button4 = new Button("button4"); //设置为流式布局,靠左 frame.setLayout(new FlowLayout(FlowLayout.LEFT)); frame.setSize(200, 200); frame.add(button1); frame.add(button2); frame.add(button3); frame.add(button4); frame.setVisible(true); } }
-
东西南北中
import java.awt.*; public class Student { public static void main(String[] args) { Frame frame = new Frame(); //东西南北中 Button east = new Button("East"); Button west = new Button("West"); Button south = new Button("South"); Button north = new Button("North"); Button center = new Button("Center"); frame.add(east, BorderLayout.EAST); frame.add(west, BorderLayout.WEST); frame.add(south, BorderLayout.SOUTH); frame.add(north, BorderLayout.NORTH); frame.add(center, BorderLayout.CENTER); frame.setVisible(true); } }
-
表格布局
import java.awt.*; public class Student { public static void main(String[] args) { Frame frame = new Frame(); Button button1 = new Button("button1"); Button button2 = new Button("button2"); Button button3 = new Button("button3"); Button button4 = new Button("button4"); Button button5 = new Button("button5"); Button button6 = new Button("button6"); //2行3列 frame.setLayout(new GridLayout(2, 3)); frame.add(button1); frame.add(button2); frame.add(button3); frame.add(button4); frame.add(button5); frame.add(button6); frame.pack();//自动选择最优布局 frame.setVisible(true); } }
2.6 事件监听
某些事情发生时要干些什么!
如键盘敲下就是一个事件
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class Student {
public static void main(String[] args) {
//想要按下按钮触发一下事件
Button button = new Button();
Frame frame = new Frame();
//添加动作监听器
button.addActionListener(new MyActionListener());
frame.add(button);
frame.setVisible(true);
//添加关闭窗口事件
CloseTheWindow(frame);
}
private static void CloseTheWindow(Frame frame) {
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
}
class MyActionListener implements ActionListener {
@Override
//按钮按下会触发此事件
public void actionPerformed(ActionEvent e) {
}
}
2.7 多个按钮使用同一个监听器
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class Student {
public static void main(String[] args) {
//想要按下按钮触发一下事件
Button button1 = new Button("开始");
//设置按钮信息
button1.setActionCommand("button1");
Button button2 = new Button("停止");
button2.setActionCommand("button2");
Frame frame = new Frame();
//添加动作监听器
MyActionListener myActionListener = new MyActionListener();
//可以写多个按钮设置同一个监听器
button1.addActionListener(myActionListener);
button2.addActionListener(myActionListener);
frame.setBounds(200, 200, 500, 400);
frame.add(button1, BorderLayout.NORTH);
frame.add(button2, BorderLayout.SOUTH);
frame.setVisible(true);
}
}
2.8 输入框TextField监听
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class Student {
public static void main(String[] args) {
new MyFrame().setVisible(true);
}
}
class MyActionListener implements ActionListener {
@Override
//按下回车键会触发此事件
public void actionPerformed(ActionEvent e) {
//获取一些资源返回一个对象
TextField textField = (TextField) e.getSource();
System.out.println(textField.getText());//获得文本域的内容
//获取完毕后清空文本域
textField.setText("");
}
}
class MyFrame extends Frame {
public MyFrame() throws HeadlessException {
//创建一个文本框
TextField textField = new TextField();
//设置输入文本域替换编码
textField.setEchoChar('*');
add(textField);
//监听文本框
textField.addActionListener(new MyActionListener());
pack();
}
}
设计一个简单的计算机类
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class Student {
public static void main(String[] args) {
new Calculator().setVisible(true);
}
}
//计算器类
class Calculator extends Frame {
private TextField textField1, textField2, textField3;
public Calculator() throws HeadlessException {
//3个文本框
textField1 = new TextField(10);//字符最大长度为10
textField2 = new TextField(10);
textField3 = new TextField(20);
//1个按钮
Button button = new Button("=");
//添加对按钮的监控
button.addActionListener(new MyListener());
//1个标签
Label label = new java.awt.Label("+");
//布局
setLayout(new FlowLayout());
add(textField1);
add(label);
add(textField2);
add(button);
add(textField3);
pack();
}
//监听器类
private class MyListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
String number1 = textField1.getText();
String number2 = textField2.getText();
textField1.setText("");
textField2.setText("");
int sum = Integer.parseInt(number1) + Integer.parseInt(number2);
textField3.setText(sum + "");
}
}
}
2.9 画笔
import java.awt.*;
public class Student extends Frame {
/**
* {@inheritDoc}
*
* @param g
* @since 1.7
*/
@Override
public void paint(Graphics g) {
//设置画笔的颜色
g.setColor(Color.red);
//画画椭圆
g.drawOval(100, 100, 100, 100);
//画实心矩形
g.fillRect(200, 200, 100, 100);
}
public Student() {
setBounds(200, 200, 500, 300);
}
public static void main(String[] args) {
new Student().setVisible(true);
}
}
2.10 鼠标监听
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.LinkedList;
import java.util.List;
import java.util.ListIterator;
public class Student extends Frame {
//存放坐标点容器
private List<Point> list;
@Override
public void paint(Graphics g) {
g.setColor(Color.red);
ListIterator<Point> pointListIterator = list.listIterator();
//遍历容器内坐标
while (pointListIterator.hasNext()) {
Point point = pointListIterator.next();
g.fillOval(point.x, point.y, 10, 10);
}
}
public Student(String title) {
super(title);
list = new LinkedList<Point>();
setBounds(200, 200, 500, 300);
//添加鼠标监听器
addMouseListener(new MyMouseListener());
}
public static void main(String[] args) {
new Student("画板").setVisible(true);
}
//需要监听鼠标位置
private class MyMouseListener extends MouseAdapter {
//鼠标 一般有:按下,弹起,按住不放
@Override
public void mousePressed(MouseEvent e) {
Frame frame = (Frame) e.getSource();
//这里点击的时候就会在界面上产生一个点
//存放在容器中
list.add(e.getPoint());
//每次点击鼠标都要重画一次
frame.repaint();
}
}
}
2.11 窗口监听
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class Student extends Frame {
public Student() throws HeadlessException {
setBounds(200, 200, 500, 400);
addWindowListener(new MyWindowListener());
}
private class MyWindowListener extends WindowAdapter {
//窗口关闭时会触发
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
//聚焦到窗口会触发
@Override
public void windowActivated(WindowEvent e) {
System.out.println("激活");
}
}
public static void main(String[] args) {
new Student().setVisible(true);
}
}
2.12 键盘监听
import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
public class Student extends Frame {
public Student() throws HeadlessException {
setBounds(200, 200, 500, 300);
//添加键盘监听
addKeyListener(new MyKeyboardListener());
}
private class MyKeyboardListener extends KeyAdapter {
//按下和释放
//按下键盘
@Override
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_A) {
System.out.println("您按下了A键");
}
}
//释放键盘
@Override
public void keyReleased(KeyEvent e) {
System.out.println("您松开了按键");
}
}
public static void main(String[] args) {
new Student().setVisible(true);
}
}
3. Swing
3.1 窗口,面板
import javax.swing.*;
import java.awt.*;
public class Student {
public void init() {
JFrame frame = new JFrame("这是一个JFrame窗口");
frame.setVisible(true);
frame.setBounds(200, 200, 500, 400);
//关闭事件
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
//添加组件
JLabel label = new JLabel("你好!");
frame.add(label);
//获得一个内窗口
Container contentPane = frame.getContentPane();
//设置内窗口的背景色
contentPane.setBackground(Color.cyan);
//设置水平对齐方式,水平居中
label.setHorizontalAlignment(SwingConstants.CENTER);
}
public static void main(String[] args) {
new Student().init();
}
}
3.2 弹窗
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
public class Student extends JFrame {
public Student() throws HeadlessException {
setBounds(200, 200, 500, 400);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
//获取内窗口
Container contentPane = getContentPane();
//绝对布局
contentPane.setLayout(null);
//按钮
JButton button = new JButton("点击弹窗");
//绝对定位
button.setBounds(30, 30, 200, 50);
//添加按钮监听
button.addActionListener(new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
new MyDialog();
}
});
contentPane.add(button);
}
private class MyDialog extends JDialog {
public MyDialog() {
this.setVisible(true);
this.setBounds(100, 100, 300, 300);
Container contentPane = getContentPane();
contentPane.setLayout(null);
JLabel label=new JLabel("我是广告");
label.setSize(60,70);
contentPane.add(label);
}
}
public static void main(String[] args) {
new Student().setVisible(true);
}
}
3.3 标签
ICON图标
import javax.swing.*;
import java.awt.*;
public class Student {
public static void main(String[] args) {
new MyIcon().init();
}
}
class MyIcon extends JFrame implements Icon {
private int width;
private int height;
public MyIcon(int width, int height) throws HeadlessException {
this.width = width;
this.height = height;
}
public MyIcon() throws HeadlessException {
}
public void init() {
//创建一个图标
MyIcon icon = new MyIcon(20, 20);
//把图标放入标签内
JLabel label = new JLabel("我的Icon", icon, SwingConstants.CENTER);
Container contentPane = this.getContentPane();
this.setBounds(200, 200, 500, 400);
contentPane.add(label);
this.setVisible(true);
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
@Override
public void paintIcon(Component c, Graphics g, int x, int y) {
g.fillOval(x, y, width, height);
}
@Override
public int getIconWidth() {
return width;
}
@Override
public int getIconHeight() {
return height;
}
}
ICON图片
import javax.swing.*;
import java.awt.*;
import java.net.URL;
public class Student {
public static void main(String[] args) {
new MyIcon();
}
}
class MyIcon extends JFrame {
public MyIcon() throws HeadlessException {
JLabel label = new JLabel("表情包");
//获取文件的地址
URL url = MyIcon.class.getResource("img.png");
ImageIcon imageIcon = new ImageIcon(url);
//添加图标图片
label.setIcon(imageIcon);
//设置图片居中
label.setHorizontalAlignment(SwingConstants.CENTER);
Container contentPane = getContentPane();
contentPane.add(label);
setVisible(true);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
}
3.4 面板
JPanel面板
import javax.swing.*;
import java.awt.*;
public class Student extends JFrame {
public Student() throws HeadlessException {
Container contentPane = getContentPane();
//边距为10
contentPane.setLayout(new GridLayout(2, 1, 10, 10));
JPanel jPanel = new JPanel(new GridLayout(1, 3));
jPanel.add(new JButton("1"));
jPanel.add(new JButton("1"));
jPanel.add(new JButton("1"));
JPanel jPanel1 = new JPanel(new GridLayout(1, 2));
jPanel1.add(new JButton("2"));
jPanel1.add(new JButton("2"));
JPanel jPanel2 = new JPanel(new GridLayout(1, 3));
jPanel2.add(new JButton("3"));
jPanel2.add(new JButton("3"));
jPanel2.add(new JButton("3"));
JPanel jPanel3 = new JPanel(new GridLayout(2, 2));
jPanel3.add(new JButton("4"));
jPanel3.add(new JButton("4"));
jPanel3.add(new JButton("4"));
jPanel3.add(new JButton("4"));
//此处插入4个面板contentPane会优化排列
contentPane.add(jPanel);
contentPane.add(jPanel1);
contentPane.add(jPanel2);
contentPane.add(jPanel3);
this.setVisible(true);
this.setSize(100, 100);
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new Student();
}
}
滚动条JScrollPane
import javax.swing.*;
import java.awt.*;
public class Student extends JFrame {
public Student() throws HeadlessException {
Container contentPane = getContentPane();
//文本域
JTextArea textArea = new JTextArea(20, 50);
textArea.setText("你好呀!");
//滚动面板
JScrollPane jScrollPane = new JScrollPane(textArea);
contentPane.add(jScrollPane);
setBounds(200, 200, 500, 400);
setVisible(true);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new Student();
}
}
3.5 按钮
-
图片按钮
import javax.swing.*; import java.awt.*; import java.net.URL; public class Student extends JFrame { public Student() throws HeadlessException { Container contentPane = getContentPane(); URL url = Student.class.getResource("img.png"); ImageIcon imageIcon = new ImageIcon(url); //将图片放在按钮上 JButton button = new JButton(); button.setIcon(imageIcon); //设置鼠标悬停效果 button.setToolTipText("点击查看"); contentPane.add(button); setBounds(200, 200, 500, 500); setVisible(true); setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); } public static void main(String[] args) { new Student(); } }
-
单选按钮
import javax.swing.*; import java.awt.*; import java.net.URL; public class Student extends JFrame { public Student() throws HeadlessException { Container contentPane = getContentPane(); //单选框 JRadioButton jRadioButton1 = new JRadioButton("jRadioButton1"); JRadioButton jRadioButton2 = new JRadioButton("jRadioButton2"); JRadioButton jRadioButton3 = new JRadioButton("jRadioButton3"); //由于单选框只能在多个选项中选择一个需要编入一个组 ButtonGroup buttonGroup = new ButtonGroup(); buttonGroup.add(jRadioButton1); buttonGroup.add(jRadioButton2); buttonGroup.add(jRadioButton3); contentPane.add(jRadioButton1, BorderLayout.CENTER); contentPane.add(jRadioButton2, BorderLayout.NORTH); contentPane.add(jRadioButton3, BorderLayout.SOUTH); setBounds(200, 200, 500, 500); setVisible(true); setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); } public static void main(String[] args) { new Student(); } }
-
复选按钮
import java.awt.*; public class Student extends JFrame { public Student() throws HeadlessException { Container contentPane = getContentPane(); JCheckBox jCheckBox1 = new JCheckBox("jCheckBox1"); JCheckBox jCheckBox2 = new JCheckBox("jCheckBox2"); contentPane.add(jCheckBox1, BorderLayout.NORTH); contentPane.add(jCheckBox2, BorderLayout.SOUTH); setBounds(200, 200, 500, 500); setVisible(true); setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); } public static void main(String[] args) { new Student(); } }
3.6 列表
-
下拉框
import javax.swing.*; import java.awt.*; public class Student extends JFrame { public Student() throws HeadlessException { Container contentPane = getContentPane(); JComboBox jComboBox = new JComboBox(); jComboBox.addItem(null); jComboBox.addItem("A"); jComboBox.addItem("B"); jComboBox.addItem("C"); contentPane.add(jComboBox); setBounds(200, 200, 500, 500); setVisible(true); setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); } public static void main(String[] args) { new Student(); } }
-
列表框
import javax.swing.*; import java.awt.*; public class Student extends JFrame { public Student() throws HeadlessException { Container contentPane = getContentPane(); //列表中的内容 String[] strings = {"1", "2", "3", "4"}; //列表 JList list = new JList(strings); contentPane.add(list); setBounds(200, 200, 500, 500); setVisible(true); setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); } public static void main(String[] args) { new Student(); } }
3.7 文本框
-
文本框
import javax.swing.*; import java.awt.*; public class Student extends JFrame { public Student() throws HeadlessException { Container contentPane = getContentPane(); JTextField jTextField1 = new JTextField("请输入账号"); JTextField jTextField2 = new JTextField("请输入密码"); contentPane.add(jTextField1, BorderLayout.NORTH); contentPane.add(jTextField2, BorderLayout.SOUTH); setBounds(200, 200, 500, 500); setVisible(true); setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); } public static void main(String[] args) { new Student(); } }
-
密码框
import javax.swing.*; import java.awt.*; public class Student extends JFrame { public Student() throws HeadlessException { Container contentPane = getContentPane(); JPasswordField jPasswordField = new JPasswordField(); //设置输入替换编码 jPasswordField.setEchoChar('-'); contentPane.add(jPasswordField); setBounds(200, 200, 500, 500); setVisible(true); setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); } public static void main(String[] args) { new Student(); } }
-
文本域
import javax.swing.*; import java.awt.*; public class Student extends JFrame { public Student() throws HeadlessException { Container contentPane = getContentPane(); JPasswordField jPasswordField = new JPasswordField(); //设置输入替换编码 jPasswordField.setEchoChar('-'); contentPane.add(jPasswordField); setBounds(200, 200, 500, 500); setVisible(true); setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); } public static void main(String[] args) { new Student(); } }