GUI编程
文章目录
1、简介
Gui的核心技术:Swing AWT
- 界面不美观
- 需要jre环境
2、AWT
2.1、AWT介绍
-
包含了很多类和接口,GUI
-
元素:窗口,按钮
-
Java.awt包里
2.2、组件和容器
1、Frame
//Gui的第一个界面
public class TestFrame {
public static void main(String[] args) {
//Frame
Frame frame = new Frame("我的第一个图形窗口");
//需要设置可见性 w h
frame.setVisible(true);
//设置窗口大小
frame.setSize(400,400);
//设置背景颜色
// frame.setBackground(Color.BLACK);
frame.setBackground(new Color(4, 171, 238));
//弹出的初始位置
frame.setLocation(200,200);
//设置大小固定
frame.setResizable(false);
}
}
问题,不能关闭,只能停止
尝试回顾封装
public class TeseFrame2 {
public static void main(String[] args) {
MyFrame myFrame1 = new MyFrame(400, 400, 200, 200, Color.red);
MyFrame myFrame2 = new MyFrame(600, 400, 200, 200, Color.yellow);
MyFrame myFrame3 = new MyFrame(400, 600, 200, 200, Color.blue);
MyFrame myFrame4 = new MyFrame(600, 600, 200, 200,Color.green);
}
}
//封装
class MyFrame extends Frame {
static int id =0 ;//可能存在多个窗口,定义一个计数器
//无参构造
public MyFrame(int x,int y , int w ,int h ,Color color){
super("Myframe"+(++id));
//需要设置可见性 w h
setVisible(true);
//设置长宽,初始位置,setSize+setLocation
setBounds(x,y,w,h);
setBackground(color);
setResizable(false);
}
}
2、面板Panel
/**
* Panel 可以看成一个空间,但是不能单独
*/
public class TestPanel {
public static void main(String[] args) {
Frame frame = new Frame();
Panel panel = new Panel();
//设置布局
frame.setLayout(null);
//坐标
frame.setBounds(800,400,800,800);
frame.setBackground(Color.yellow);
//panel 坐标,相对frame位置
panel.setBounds(50,50,400,400);
panel.setBackground(Color.CYAN);
//添加面板panel
frame.add(panel);
frame.setVisible(true);//窗口可见
//设置监听
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
2.3、布局管理器
-
流式布局
-
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"); //设置为流式布局 ,默认center,中间 // frame.setLayout(new FlowLayout()); frame.setLayout(new FlowLayout(FlowLayout.LEFT));//从从左到右排 frame.setSize(200,200); //添加按钮 frame.add(button1); frame.add(button2); frame.add(button3); frame.setVisible(true); }
-
东西南北中
-
public static void main(String[] args) { Frame frame = new Frame("bordeer"); 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); frame.setBounds(200,200,200,200); }
-
表格布局
-
public static void main(String[] args) { Frame frame = new Frame("Grid"); 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"); frame.setLayout(new GridLayout(3,2)); frame.add(btn1); frame.add(btn2); frame.add(btn3); frame.add(btn4); frame.add(btn5); frame.pack();//Java函数,自动布局 frame.setVisible(true);
1、按图片做一个例子
- 拆分,Frame两个表格;2行1列
- 上半部
- Panel1:一个west按钮,一个east按钮,一个Center放Panel2
- Panel2:一个表格,2行1列,放2个button
- 下半部
- Panel3:一个west按钮,一个east按钮,一个Center放Panel4
- Panel4:一个表格,2行2列,放4个button
public static void main(String[] args) {
Frame frame = new Frame();
frame.setLayout(new GridLayout(2,1));
frame.setBounds(500,500,800,600);
Panel p1 = new Panel(new BorderLayout());
Panel p2 = new Panel(new GridLayout(2,1));
Panel p3 = new Panel(new BorderLayout());
Panel p4 = new Panel(new GridLayout(2,2));
//上半部
p1.add(new Button("west-1"),BorderLayout.WEST);
p1.add(new Button("east-1"),BorderLayout.EAST);
p2.add(new Button("p1-1"));
p2.add(new Button("p2-2"));
p1.add(p2,BorderLayout.CENTER);
//下半部
p3.add(new Button("west-2"),BorderLayout.WEST);
p3.add(new Button("east-2"),BorderLayout.EAST);
for (int i = 0; i < 4; i++) {
p4.add(new Button("p1-"+i));
}
p3.add(p4,BorderLayout.CENTER);
frame.add(p1);
frame.add(p3);
frame.setVisible(true);
frame.setResizable(false);
//设置监听
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
2、总结
- Frame是一个顶级窗口
- Panel无法单独显示,必须添加到某个容器中
- 布局管理器
- 流式
- 东西南北中
- 表格
- 大小,定位,背景颜色,监听
2.4、事件监听
- 多个按钮共享事件
public static void main(String[] args) {
Frame frame = new Frame("监听");
//按钮,触发事件
Button button1 = new Button("start");
Button button2 = new Button("stop");
//写了可以获取处理,没写会读默认值
button2.setActionCommand("btn2-stop");
MyMonitor myMonitor = new MyMonitor();
button1.addActionListener(myMonitor);
button2.addActionListener(myMonitor);
frame.add(button1,BorderLayout.NORTH);
frame.add(button2,BorderLayout.SOUTH);
frame.setVisible(true);
frame.pack();
}
}
class MyMonitor implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
//获得按钮信息
System.out.println("按钮点击了:"+e.getActionCommand());
}
2.5、输入框TextFile 监听
public class TestText01 {
public static void main(String[] args) {
//启动
new MyFrame();
}
}
class MyFrame extends Frame{
public MyFrame(){
TextField textField = new TextField();
add(textField);
//监听文本框输入的文字
MyActionLister2 myActionLister2 = new MyActionLister2();
//按下Enter,就会触发输入框的事件
textField.addActionListener(myActionLister2);
//设置替换编码
textField.setEchoChar('*');
setVisible(true);
pack();
}
}
class MyActionLister2 implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
TextField field = (TextField) e.getSource();//获得资源
System.out.printf( field.getText());//获得输入框中的文本
field.setText("");
}
}
2.6、简易计算器,组合,内部类
oop原则:组合大于继承
//继承
class A extends B{}
//组合
class A{
public B b;
}
计算器:
//简易计算器
public class TestCalc {
public static void main(String[] args) {
new Calculator();
}
}
//计算器类
class Calculator extends Frame{
public Calculator() {
//3个文本框
TextField num1 = new TextField(10);//字符数
TextField num2 = new TextField(10);//字符数
TextField num3 = new TextField(20);//字符数
//1个按钮
Button button = new Button("=");
button.addActionListener(new MyListener(num1,num2,num3));
//1个标签
Label label = new Label("+");
//布局
setLayout(new FlowLayout());
add(num1);
add(label);
add(num2);
add(button);
add(num3);
pack();
setVisible(true);
}
}
//监听器类
class MyListener implements ActionListener{
private TextField num1,num2,num3;
public MyListener(TextField num1,TextField num2,TextField num3) {
this.num1=num1;
this.num2=num2;
this.num3=num3;
}
@Override
public void actionPerformed(ActionEvent e) {
//1.获得num1 num2
int n1 = Integer.parseInt(num1.getText());
int n2 = Integer.parseInt(num2.getText());
//2 点击按钮算加法,放到第三个框
num3.setText(""+(n1+n2));
//3 清除前两个框
num1.setText("");
num2.setText("");
}
}
内部类:
- 更好的封装
- 内部类的好处,可以直接访问外部类的属性和方法
//简易计算器
public class TestCalc {
public static void main(String[] args) {
new Calculator().loadFrame();
}
}
//计算器类
class Calculator extends Frame{
//属性
TextField num1,num2,num3;
//加载方法
public void loadFrame() {
//3个文本框
num1 = new TextField(10);//字符数
num2 = new TextField(10);//字符数
num3 = new TextField(20);//字符数
//1个按钮
Button button = new Button("=");
button.addActionListener(new MyListener());
//1个标签
Label label = new Label("+");
//布局
setLayout(new FlowLayout());
add(num1);
add(label);
add(num2);
add(button);
add(num3);
pack();
setVisible(true);
}
//监听器类
//内部类的好处,可以直接访问外部类的属性和方法
private class MyListener implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
//1.获得num1 num2
int n1 = Integer.parseInt(num1.getText());
int n2 = Integer.parseInt(num2.getText());
//2 点击按钮算加法,放到第三个框
num3.setText(""+(n1+n2));
//3 清除前两个框
num1.setText("");
num2.setText("");
}
}
}
2.7、画笔
public class TestPaint {
public static void main(String[] args) {
new Mypain().loadFram();
}
}
class Mypain extends Frame{
public void loadFram(){
setBounds(200,200,600,500);
setVisible(true);
}
@Override
public void paint(Graphics g) {
//画笔,需要颜色,画画
//g.setColor(Color.blue);
//画一个圆形
// g.drawOval(100,100,100,100);
g.fillOval(100,100,100,100);//实心圆
//g.setColor(Color.yellow);
g.fillRect(150,200,200,200);
//画笔用完,还原最初的颜色
}
2.8、鼠标监听
目的:实现鼠标画画
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EGXvdQFO-1638245911867)(images\2.28.png)]
public class TeseMouseListener {
public static void main(String[] args) {
new Myframe("画图");
}
}
class Myframe extends Frame{
//画笔,监听鼠标当前位置,需要集合存储这些点
ArrayList points;
public Myframe(String title) {
super(title);
setBounds(200,200,400,300);
//存鼠标点
points = new ArrayList();
//鼠标监听器,针对窗口
this.addMouseListener(new MyMouseListener());
setVisible(true);
}
@Override
public void paint(Graphics g) {
//监听鼠标事件
Iterator iterator = points.iterator();
while (iterator.hasNext()){
Point point = (Point) iterator.next();
g.setColor(Color.red);
g.fillOval(point.x,point.y,10,10);
}
}
public void addPain(Point point){
points.add(point);
}
private class MyMouseListener extends MouseAdapter{
//鼠标,按下,弹起,按住
@Override
public void mousePressed(MouseEvent e) {
Myframe myframe = (Myframe) e.getSource();
//点击的时候再界面上产生一个点
myframe.addPain(new Point(e.getX(), e.getY()));
//每次点击鼠标重画一遍
myframe.repaint();//刷新 30帧 60
}
}
}
2.9、鼠标监听
public class TestWindow {
public static void main(String[] args) {
new WindowFrame();
}
}
class WindowFrame extends Frame{
public WindowFrame() throws HeadlessException {
setVisible(true);
setBackground(Color.CYAN);
setBounds(200,200,200,200);
addWindowListener(new WindowAdapter() {
//关闭窗口
@Override
public void windowClosing(WindowEvent e) {
// setVisible(false);//隐藏窗口
System.out.println("XXXX");
System.exit(0);//正常退出
}
//激活窗口
@Override
public void windowActivated(WindowEvent e) {
WindowFrame frame= (WindowFrame) e.getSource();
System.out.println("windowActivated");
frame.setTitle("激活");
}
});
}
}
2.10、键盘监听
public class TestKeyListener {
public static void main(String[] args) {
new KeyFrame();
}
}
class KeyFrame extends Frame{
public KeyFrame() throws HeadlessException {
super();
setBounds(100,100,500,500);
setVisible(true);
this.addKeyListener(new KeyAdapter() {
@Override
public void keyTyped(KeyEvent e) {
super.keyTyped(e);
}
//键盘按下
@Override
public void keyPressed(KeyEvent e) {
//获得键盘的码
int keyCode = e.getKeyCode();
System.out.println(keyCode);
if (keyCode == KeyEvent.VK_UP) {
System.out.println("你按了上键");
}
}
});
}
}
3、Swing
3.1、窗口
public class JFrameDemo02 {
public static void main(String[] args) {
new MyJFrame2().init();
}
}
class MyJFrame2 extends JFrame{
public void init(){
this.setVisible(true);
this.setBounds(200,200,200,200);
JLabel label = new JLabel("java");
add(label);
//居中
label.setHorizontalAlignment(SwingConstants.CENTER);
//获得一个容器
Container contentPane = getContentPane();
contentPane.setBackground(Color.cyan);
}
3.2、弹窗
package com.ccc.Lesson04;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
public class DialogDemo extends JFrame {
public DialogDemo() {
this.setVisible(true);
this.setBounds(200,200,700,500);
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
Container contentPane = this.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 MyDiologDemo();
}
});
contentPane.add(button);
}
public static void main(String[] args) {
new DialogDemo();
}
}
class MyDiologDemo extends JDialog{
public MyDiologDemo() {
this.setVisible(true);
this.setBounds(100,100,500,500);
// this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
Container contentPane = this.getContentPane();
contentPane.setLayout(null);
contentPane.add(new Label("哈哈航昂昂"));
}
}
3.3、标签
label
图片icon
public class ImageIconDemo extends JFrame {
public ImageIconDemo() throws HeadlessException {
JLabel label = new JLabel("ImageIcon");
//获取图片地址
URL url = ImageIconDemo.class.getResource("2.png");
ImageIcon imageIcon = new ImageIcon(url);
label.setIcon(imageIcon);
label.setHorizontalTextPosition(SwingConstants.CENTER);
Container contentPane = getContentPane();
contentPane.add(label);
setVisible(true);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
setBounds(300,300,200,200);
}
public static void main(String[] args) {
new ImageIconDemo();
}
3.4、面板 JPanel
package com.ccc.Lesson05;
import javax.swing.*;
import java.awt.*;
public class TestJPnel extends JFrame {
public TestJPnel() throws HeadlessException {
Container container = getContentPane();
container.setLayout(new GridLayout(2,1,10,10));//间距
JPanel jPanel = new JPanel(new GridLayout(1,3));
jPanel.add(new Button("1"));
jPanel.add(new Button("1"));
jPanel.add(new Button("1"));
container.add(jPanel);
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
setVisible(true);
setBounds(400,400,500,500);
}
public static void main(String[] args) {
new TestJPnel();
}
}
JScrollPane:滑动框
package com.ccc.Lesson05;
import javax.swing.*;
import java.awt.*;
public class JScrollDemo extends JFrame {
public JScrollDemo() {
Container container = this.getContentPane();
JTextArea jTextArea = new JTextArea(40,50);
jTextArea.setText("sdfklasdjfl;kasf");
JScrollPane jScrollPane = new JScrollPane(jTextArea);
container.add(jScrollPane);
setVisible(true);
setBounds(500,500,500,550);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new JScrollDemo();
}
}
3.5、 按钮
图片按钮
package com.ccc.Lesson05;
import javax.swing.*;
import java.awt.*;
import java.net.URL;
public class JButtonDemo01 extends JFrame {
public JButtonDemo01() throws HeadlessException {
Container contentPane = this.getContentPane();
//将一个图片变成一个图标
URL url = JButtonDemo01.class.getResource("2.png");
Icon icon = new ImageIcon(url);
//把图标放在按钮上
JButton jButton = new JButton();
jButton.setIcon(icon);
//鼠标移动到按钮上显示文字
jButton.setToolTipText("这是个图片按钮");
contentPane.add(jButton);
setVisible(true);
setBounds(500,500,550,550);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new JButtonDemo01();
}
}
单选按钮
Container contentPane = this.getContentPane();
//将一个图片变成一个图标
URL url = JButtonDemo01.class.getResource("2.png");
Icon icon = new ImageIcon(url);
//单选框
JRadioButton radioButton1 = new JRadioButton("1");
JRadioButton radioButton2 = new JRadioButton("2");
JRadioButton radioButton3 = new JRadioButton("3");
//由于单选框不能多选,分组,一个组只能选一个
ButtonGroup buttonGroup = new ButtonGroup();
buttonGroup.add(radioButton1);
buttonGroup.add(radioButton2);
buttonGroup.add(radioButton3);
contentPane.add(radioButton1,BorderLayout.NORTH);
contentPane.add(radioButton2,BorderLayout.CENTER);
contentPane.add(radioButton3,BorderLayout.SOUTH);
多选按钮
Container contentPane = this.getContentPane();
//将一个图片变成一个图标
URL url = JButtonDemo01.class.getResource("2.png");
Icon icon = new ImageIcon(url);
//多选框
JCheckBox jCheckBox1 = new JCheckBox("1");
JCheckBox jCheckBox2 = new JCheckBox("2");
JCheckBox jCheckBox3 = new JCheckBox("3");
contentPane.add(jCheckBox1,BorderLayout.SOUTH);
contentPane.add(jCheckBox2,BorderLayout.CENTER);
contentPane.add(jCheckBox3,BorderLayout.NORTH);
3.6、列表
-
下拉框
package com.ccc.Lesson06; import javax.swing.*; import java.awt.*; public class TestComboboxDemo01 extends JFrame { public TestComboboxDemo01() throws HeadlessException { Container contentPane = getContentPane(); JComboBox jComboBox = new JComboBox(); jComboBox.addItem(null); jComboBox.addItem("111"); jComboBox.addItem("122"); jComboBox.addItem("333"); contentPane.add(jComboBox); setVisible(true); setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); setBounds(500,500,500,500); } public static void main(String[] args) { new TestComboboxDemo01(); } }
-
列表框
package com.ccc.Lesson06;
import javax.swing.*;
import java.awt.*;
import java.util.Vector;
public class TestComboboxDemo02 extends JFrame {
public TestComboboxDemo02() throws HeadlessException {
Container contentPane = getContentPane();
//列表内容
// String[] str = {"1","2","3"};
Vector str = new Vector();
JList jList = new JList(str);
str.add("1");
str.add("2");
str.add("3");
contentPane.add(jList);
setVisible(true);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
setBounds(500,500,500,500);
}
public static void main(String[] args) {
new TestComboboxDemo02();
}
}
- 应用场景
- 选择地区
- 列表,展示信息,动态扩容
3.7、文本框
-
文本框
package com.ccc.Lesson06; import javax.swing.*; import java.awt.*; import java.util.Vector; public class TestTextDemo01 extends JFrame { public TestTextDemo01() throws HeadlessException { Container contentPane = getContentPane(); JTextField jTextField1 = new JTextField("hello"); JTextField jTextField2 = new JTextField("world",20); contentPane.add(jTextField1,BorderLayout.NORTH); contentPane.add(jTextField2,BorderLayout.SOUTH); setVisible(true); setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); setBounds(500,500,500,500); } public static void main(String[] args) { new TestTextDemo01(); } }
-
密码框
JPasswordField jPasswordField = new JPasswordField(); jPasswordField.setEchoChar('*'); contentPane.add(jPasswordField);
-
文本域
JTextArea jTextArea = new JTextArea(40,50); jTextArea.setText("sdfklasdjfl;kasf"); JScrollPane jScrollPane = new JScrollPane(jTextArea); container.add(jScrollPane);
写一个贪吃蛇
键盘监听
定时器Timer
时间监听
画笔
1、数据中心类
定义图片URL
定义图标
头部上下左右、身体、实物、横幅的图标
2、游戏启动类
main方法启动游戏
定义主窗口
设置主窗口大小值,可见,大小,关闭事件
添加画板
3、游戏画板类
-
定义数据
- 蛇的长度
- 蛇的坐标
- 头部方向
- 食物的坐标
- random随机食物坐标
- 积分
- 游戏的启动状态
- 游戏的失败状态
- 定时器Timer(int多少毫秒执行一次,对象)
-
构造器:
- 调用初始化方法,
- 获得焦点
- 获得键盘事件
- 启动定时器
-
初始化方法
- 初始化蛇的长度
- 初始化蛇的头部位置,身体位置
- 初始化头部的朝向
- 随机食物的坐标
- 积分初始化0
-
绘制画板
- 清屏
- 设置画板背景颜色
- 设置画板界面大小及位置 fillRect
- 把横幅画上去,数据中心获取(data)
- 积分画上去
- 设置积分字体。setFont(Font)
- 设置标语,drawString(字体,x,y)
- 画食物
- 画小蛇头
- 判断四个方向使用不同的ImageIcon
- 画小蛇身体
- 坐标就是蛇头的后一个坐标
- 判断游戏是否开始
- 设置标语,drawString(字,x,y)
- 判断游戏是否失败
- 设置标语,drawString(字,x,y)
-
键盘监听事件
- 可以实现KeyListener接口,重写keyPresssed按下方法
- 监听空格
- 监听上下左右键
-
事件监听,需要通过固定事件来刷新
- 判断游戏开始、失败状态
- 判断是否吃到食物
- 让小蛇头部移动(for)
- 判断方向及边界
- 让小蛇身体移动(for)小蛇身体坐标就是前一节的坐标
- 判断是否失败(for)
- 重画
- 定时器开启