GUI
1. 概念
-
是什么
Graphical User Interface,图形用户界面,它的两个核心库:Swing、Awt。
-
组件
- 窗口
- 弹窗
- 面板
- 文本框
- 列表框
- 按钮
- 图片
- 监听事件
- 鼠标
-
为什么学习它
- 自己制造一些小工具(外挂、破解工具)
- 维护Swing界面
- 了解MVC架构中的监听机制
2. AWT
2.1 概述
-
抽象窗口工具,包含了很多类和接口。
-
元素:窗口、按钮、文本框…
2.2 组件和容器
1. Frame
package com.itlxs.GUI;
import java.awt.*;
public class FrameDemo {
public static void main(String[] args) {
//创建一个窗口
Frame frame = new Frame("我的窗口");
//设置窗口大小
frame.setBounds(100,100,300,300);
//设置窗口的背景颜色
frame.setBackground(Color.blue);
//设置窗口不可拉伸
frame.setResizable(false);
//设置窗口可见
frame.setVisible(true);
}
}
注:此时不能关闭窗口。
2. 面板Panel
package com.itlxs.GUI;
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
public class PanelDemo {
public static void main(String[] args) {
Frame frame = new Frame();
Panel panel = new Panel();
//设置布局
frame.setLayout(null);
//坐标
frame.setBounds(300,300,500,500);
frame.setBackground(Color.black);
//坐标相对于Frame
panel.setBounds(50,50,100,100);
panel.setBackground(Color.blue);
frame.add(panel);
frame.setVisible(true);
//监听时间监听窗口关闭
//适配器模式:实现接口中的某一个方法
frame.addWindowListener(new WindowAdapter() {
@Override
//窗口关闭的时候需要做的事情
public void windowClosing(WindowEvent e) {
//结束程序
System.exit(0);
}
});
}
}
注:解决了窗口关闭问题。
3. 布局
***Frame.pack()***是JAVA语言的一个函数,这个函数的作用就是根据窗口里面的布局及组件的preferredSize来确定frame的最佳大小。
-
流式布局(Flow)
package com.itlxs.GUI; import java.awt.*; public class LayoutButtonDemo { 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"); //设为流式布局(装到窗口的组件以流式排列) frame.setLayout(new FlowLayout()); frame.setSize(200,200); //添加按钮 frame.add(button1); frame.add(button2); frame.add(button3); frame.setVisible(true); } }
-
东西南北中(Border)
package com.itlxs.GUI; import java.awt.*; public class LayoutButtonDemo { 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.setSize(200,200); frame.setVisible(true); } }
-
表格布局(Grid)
package com.itlxs.GUI; import java.awt.*; public class LayoutButtonDemo { public static void main(String[] args) { Frame frame = new Frame(); //组件-按钮 Button btn1 = new Button("btn1"); Button btn2 = new Button("btn2"); Button btn3 = new Button("btn3"); Button btn4 = new Button("btn4"); Button btn5 = new Button("btn5"); Button btn6 = new Button("btn6"); //设为表格布局 frame.setLayout(new GridLayout(3,2)); //添加按钮 frame.add(btn1); frame.add(btn2); frame.add(btn3); frame.add(btn4); frame.add(btn5); frame.add(btn6); frame.setSize(200,200); frame.setVisible(true); } }
4. 事件监听
- 当发生了某些事情后,要干什么。
package com.itlxs.GUI;
import java.awt.*;
import java.awt.event.*;
public class ListenerDemo {
public static void main(String[] args) {
Frame frame = new Frame();
Button button = new Button("start");
Button button2 = new Button("end");
//设置按钮信息,不设置取默认值
button2.setActionCommand("button2-end");
//监听按钮,被点击触发事件
MyMoniter myMoniter = new MyMoniter();
button.addActionListener(myMoniter);
button2.addActionListener(myMoniter);
//添加按钮
frame.add(button,BorderLayout.NORTH);
frame.add(button2,BorderLayout.SOUTH);
frame.pack();
windowClose(frame);
frame.setVisible(true);
}
public static void windowClose(Frame frame){
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
}
class MyMoniter implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("按钮被点击了");
System.out.println("msg=>"+e.getActionCommand());
}
}
5. 文本框
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class TextFieldDemo {
public static void main(String[] args) {
new MyFrame1();
}
}
class MyFrame1 extends Frame{
public MyFrame1(){
TextField textField = new TextField();
add(textField);
//监听文本框,按下enter键触发事件
MyListenner myListenner = new MyListenner();
textField.addActionListener(myListenner);
//设置替换编码,即加密你输入的内容
textField.setEchoChar('*');
setVisible(true);
pack();
}
}
class MyListenner implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
TextField field = (TextField) e.getSource();
System.out.println(field.getText());
//设置文本框内容为空字符串,相当于清空文本框
field.setText("");
}
}
6. 简易计算机(练习)
- 完全面向对象,组合知识
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class CalculatorDemo {
public static void main(String[] args) {
new Calculator1().Calculate();
}
}
//实现简单的加法
class Calculator1 extends Frame{
//属性
TextField num1,num2,num3;
//方法
public void Calculate(){
//三个文本框
num1 = new TextField(10);
num2 = new TextField(10);
num3 = new TextField(10);
//按钮
Button button = new Button("=");
//标签
Label label = new Label("+");
//给等号按钮标签绑定监听事件
MyCalculatorListener myCalculatorListener = new MyCalculatorListener(this);
button.addActionListener(myCalculatorListener);
//布局
setLayout(new FlowLayout());
add(num1);
add(label);
add(num2);
add(button);
add(num3);
setVisible(true);
pack();
}
}
class MyCalculatorListener implements ActionListener{
//组合:它不是继承,它大于继承,它是在一个类中组合另一个类、使用另一个类。
Calculator1 calculator = null;
public MyCalculatorListener(Calculator1 calculator){
this.calculator = calculator;
}
@Override
public void actionPerformed(ActionEvent e) {
//1.获取前两个文本框的值
int n1 = Integer.parseInt(calculator.num1.getText());
int n2 = Integer.parseInt(calculator.num2.getText());
//2.将获取的值相加的值,输出第三个文本框
calculator.num3.setText(""+(n1+n2));
//3.清除前两个文本框
calculator.num1.setText("");
calculator.num2.setText("");
}
}
- 内部类,进行更好的包装
package com.itlxs.GUI;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class CalculatorDemo {
public static void main(String[] args) {
new Calculator1().Calculate();
}
}
class Calculator1 extends Frame{
TextField num1,num2,num3;
public void Calculate(){
num1 = new TextField(10);
num2 = new TextField(10);
num3 = new TextField(10);
Button button = new Button("=");
Label label = new Label("+");
//给等号标签绑定监听事件
button.addActionListener(new MyCalculatorListener());
setLayout(new FlowLayout());
add(num1);
add(label);
add(num2);
add(button);
add(num3);
setVisible(true);
pack();
}
// 内部类的最大好处就是可以畅通无阻的访问外部类的属性和方法
private class MyCalculatorListener implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
//1.获取前两个文本框的值
int n1 = Integer.parseInt(num1.getText());
int n2 = Integer.parseInt(num2.getText());
//2.将获取的值相加的值,输出第三个文本框
num3.setText(""+(n1+n2));
//3.清除前两个文本框
num1.setText("");
num2.setText("");
}
}
}
7. 画笔
package com.itlxs.GUI;
import java.awt.*;
public class PaintDemo {
public static void main(String[] args) {
new MyPaint().loadFrame();
}
}
class MyPaint extends Frame{
public void loadFrame(){
setBounds(200,200,600,500);
setVisible(true);
}
@Override
public void paint(Graphics g) {
//画笔要有颜色
g.setColor(Color.cyan);
//(x,y)为图形的中心点
//画矩形,空心的
g.drawRect(100,100,100,100);
g.setColor(Color.red);
//实心的
g.fillOval(100,100,100,100);
}
}
8. 鼠标监听
package com.itlxs.GUI;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.Iterator;
public class PaintDemo {
public static void main(String[] args) {
new MyPaint().loadFrame();
}
}
class MyPaint extends Frame{
ArrayList points;
public void loadFrame(){
points = new ArrayList();
//1.添加鼠标监听事件
addMouseListener(new MyMouseListener());
setBounds(200,200,600,500);
setVisible(true);
}
@Override
public void paint(Graphics g) {
//4.画画,监听鼠标事件
Iterator iterator = points.iterator();
while (iterator.hasNext()){
Point point = (Point) iterator.next();
g.setColor(Color.cyan);
g.fillOval(point.x,point.y,10,10);
}
}
//3.添加界面上的点到集合中
public void addPoint(Point point){
points.add(point);
}
//适配器模式
private class MyMouseListener extends MouseAdapter{
//鼠标监听:按下,弹开,按住不放
@Override
public void mousePressed(MouseEvent e) {
//2.获取当前窗口鼠标点击的位置,将其记录在集合中
MyPaint frame = (MyPaint) e.getSource();
frame.addPoint(new Point(e.getX(),e.getY()));
frame.repaint();//这里调用画笔
}
}
}
9. 窗口监听
10. 键盘监听
4. 总结
- Frame是一个顶级窗口
- Panel无法单独显示,必须添加到某个容器中
- 布局管理
- 流式
- 东西南北中
- 表格
3. Swing
- 它相当于Awt的儿子,具有更强大的功能。
3.1 窗口
package com.itlxs.GUI;
import javax.swing.*;
import java.awt.*;
public class JFrameDemo {
public static void main(String[] args) {
new MyJFrame().init();
}
}
class MyJFrame extends JFrame{
//初始化
public void init(){
this.setBounds(10,10,200,300);
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
this.setVisible(true);
//生成标签并居中
JLabel jLabel = new JLabel("欢迎来祖安!");
jLabel.setHorizontalAlignment(SwingConstants.CENTER);
//容器实例化
Container container = this.getContentPane();//相当于把窗口实例化为一个能装东西的容器。
container.setBackground(Color.cyan);
container.add(jLabel);
}
}
注:与Frame生成窗口不同的是,他需要实例化窗口。
3.2 弹窗
一种特殊的窗口
package com.itlxs.GUI;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class JDialogDemo extends JFrame {
public JDialogDemo(){
setBounds(100,100,600,600);
setVisible(true);
//实例化窗口,装东西
Container container = this.getContentPane();
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
container.setBackground(Color.cyan);
container.setLayout(null);//绝对布局:可以自己设置组件的位置
//给按钮添加单击事件
JButton jButton = new JButton("弹窗");
jButton.setBounds(30,30,100,100);
jButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
new MyDialogDemo();
}
});
container.add(jButton);
}
public static void main(String[] args) {
new JDialogDemo();
}
}
//弹窗
class MyDialogDemo extends JDialog{
public MyDialogDemo(){
this.setBounds(300,300,500,500);
this.setBackground(Color.black);
this.setVisible(true);
//实例化弹窗
Container container = this.getContentPane();
container.setLayout(null);
JLabel label = new JLabel("弹窗成功");
label.setBounds(20,30,100,100) ;
container.setBackground(Color.cyan);
container.add(label);
}
}
3.3 图标
-
Icon
package com.itlxs.GUI; import javax.swing.*; import java.awt.*; public class IconDemo extends JFrame implements Icon { private int width; private int height; public IconDemo(){ } public IconDemo(int width,int height){ this.width = width; this.height = height; } public void init(){ IconDemo iconDemo = new IconDemo(15, 15); //图标可以放在标签上,也可以放在按钮上 //给标签设置图标 JLabel label = new JLabel("icontest", iconDemo, SwingConstants.CENTER); Container container = getContentPane(); container.add(label); //设置可见 this.setVisible(true); this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); } public static void main(String[] args) { new IconDemo().init(); } @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; } }
-
ImageIcon
package com.itlxs.GUI; import javax.swing.*; import java.awt.*; import java.net.URL; public class ImageIconDemo extends JFrame{ public ImageIconDemo(){ //获取图片的地址 JLabel label = new JLabel("ImageIcon"); URL url = ImageIconDemo.class.getResource("cloud2.jpg"); //创建图标,添加到标签上 ImageIcon imageIcon = new ImageIcon(url); label.setIcon(imageIcon); //实例化窗口 Container container = getContentPane(); container.add(label); //窗口基本设置 setVisible(true); setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); setBounds(100,200,300,340); } public static void main(String[] args) { new ImageIconDemo(); } }
3.4 面板
-
Jpanel
public class JPanelDemo extends JFrame{ public JPanelDemo(){ Container container = this.getContentPane(); container.setLayout(new GridLayout(2,1,10,10)); //创建面板 JPanel jPanel = new JPanel(new GridLayout(1, 3)); JPanel jPane2 = new JPanel(new GridLayout(1,2)); JPanel jPane3 = new JPanel(new GridLayout(2,3)); //添加按钮 jPanel.add(new JButton("1")); jPanel.add(new JButton("1")); jPanel.add(new JButton("1")); jPane2.add(new JButton("2")); jPane2.add(new JButton("2")); jPane3.add(new JButton("3")); jPane3.add(new JButton("3")); jPane3.add(new JButton("3")); jPane3.add(new JButton("3")); jPane3.add(new JButton("3")); jPane3.add(new JButton("3")); container.add(jPanel); container.add(jPane2); container.add(jPane3); //基本设置 setVisible(true); setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); setBounds(100,100,150,250); } public static void main(String[] args) { new JPanelDemo(); } }
-
ScrollPanel: 带滚动条的面板
public class JScrollDemo extends JFrame { public JScrollDemo(){ Container container = this.getContentPane(); //文本域 TextArea textArea = new TextArea(10, 50); textArea.setText("这是文本域"); //Scroll面板 JScrollPane jScrollPane = new JScrollPane(textArea); container.add(jScrollPane); //基本设置 setVisible(true); setBounds(100,200,300,350); setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); } public static void main(String[] args) { new JScrollDemo(); } }
3.5 按钮
-
普通按钮
public class JButtonDemo2 extends JFrame { public JButtonDemo2(){ Container container = this.getContentPane(); //获取图标,把图片路径放在src下 URL resource = JButtonDemo2.class.getResource("cloud2.jpg"); Icon icon = new ImageIcon(resource); //生成普通按钮, JButton jbutton1 = new JButton("jbutton1"); jbutton1.setIcon(icon); container.add(jbutton1); //基本设置 setSize(300,400); setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); setVisible(true); } public static void main(String[] args) { new JButtonDemo2(); } }
-
单选按钮
public class JButtonDemo2 extends JFrame { public JButtonDemo2(){ Container container = this.getContentPane(); //获取图标,把图片路径放在src下 URL resource = JButtonDemo2.class.getResource("cloud2.jpg"); Icon icon = new ImageIcon(resource); //单选框 JRadioButton radioButton1 = new JRadioButton("radioButton1"); JRadioButton radioButton2 = new JRadioButton("radioButton2"); JRadioButton radioButton3 = new JRadioButton("radioButton3"); //由于只能选择一个,要对其分组,是分组中的只能选择一个 ButtonGroup buttonGroup = new ButtonGroup(); buttonGroup.add(radioButton1); buttonGroup.add(radioButton2); buttonGroup.add(radioButton3); container.add(radioButton1,BorderLayout.CENTER); container.add(radioButton2,BorderLayout.NORTH); container.add(radioButton3,BorderLayout.SOUTH); //基本设置 setSize(300,400); setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); setVisible(true); } public static void main(String[] args){ new JButtonDemo2(); } }
-
复选按钮
//生成多选框按钮 Checkbox checkbox1 = new Checkbox("checkbox1"); Checkbox checkbox2 = new Checkbox("checkbox2"); //添加到容器 container.add(checkbox1,BorderLayout.NORTH); container.add(checkbox2,BorderLayout.SOUTH);
3.6 下拉框,列表框
-
下拉框
public class ComboDemo extends JFrame{ public ComboDemo(){ Container container = this.getContentPane(); //生成 JComboBox status = new JComboBox(); //设置内容 status.addItem(null); status.addItem("正在热映"); status.addItem("已下架"); status.addItem("即将上映"); container.add(status); //基本设置 setSize(300,400); setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); setVisible(true); } public static void main(String[] args) { new ComboDemo(); }
-
列表框
//生成列表内容 String[] contents = { "111","222","333"}; //生成列表 JList jList = new JList(contents); container.add(jList); //-------------------------------------------- //动态生成内容 Vector contents = new Vector(); JList jList = new JList(contents); contents.add("1111"); contents.add("2222"); contents.add("3333"); container.add(jList);
应用场景:
- 用于选择诸如地区之类的,或者一些单个选项
- 列表,用于展示信息,一般是动态扩容
3.7 文本框,密码框,文本域
-
文本框 JTextField
public class JTextDemo extends JFrame{ public JTextDemo(){ Container container = this.getContentPane(); //生成 JTextField textField1 = new JTextField("hello"); JTextField textField2 = new JTextField("world",20); //添加 container.add(textField1,BorderLayout.NORTH); container.add(textField2,BorderLayout.SOUTH); //基本设置 setSize(300,400); setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); setVisible(true); } public static void main(String[] args) { new JTextDemo(); } }
-
密码框 JPasswordField
//生成 JPasswordField jPasswordField = new JPasswordField(); jPasswordField.setEchoChar('*');//设置 //添加 container.add(jPasswordField,BorderLayout.NORTH);
-
文本域 JTextArea
//生成 TextArea textArea = new TextArea(10, 50); textArea.setText("这是文本域");