java-GUI编程学习总结
狂神说java-GUI编程学习总结
- 1.简介
- 2、AWT
- 2.1、实现如图1-2
- (1)面向过程写法
- (2)内部类写法
- (3)完全改造成面向对象
- 3、Swing
- 3.1、鼠标花点
- 3.2、弹窗
- 3.3、标签(Icon和ImageIcon)
- 3.4、JScroll面板
- 3.5、JButton(单选框、复选框)
- 3.5.1、单选框
- 3.5.2、复选框
- 4、贪吃蛇
1.简介
GUI的核心:Awt和Swing
2、AWT
2.1、实现如图1-2
package 寒假训练.狂神.GUI;
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class TestButton extends Frame {
public TestButton() {
Frame frame = new Frame();
frame.setTitle("这是布局的button");
frame.setBounds(200,100,500,400);
frame.setBackground(new Color(141, 66, 73));
frame.setLayout(new GridLayout(2,1));
frame.setVisible(true);
//四个面板
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("east-1"),BorderLayout.EAST);
p1.add(new Button("West-1"),BorderLayout.WEST);
p2.add(new Button("p2-1"));
p2.add(new Button("p2-2"));
p1.add(p2,BorderLayout.CENTER);
frame.add(p1);
//下边
p3.add(new Button("east-2"),BorderLayout.EAST);
p3.add(new Button("West-2"),BorderLayout.WEST);
for (int i = 0; i < 4; i++) {
p4.add(new Button("p4-"+i));
}
p3.add(p4,BorderLayout.CENTER);
frame.add(p3);
//监听鼠标事件
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
public static void main(String[] args) {
new TestButton();
}
}
2.2、计算器
(1)面向过程写法
package 寒假训练.狂神.GUI;
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 TestCul {
public static void main(String[] args) {
new Calculator();
}
}
class Calculator extends Frame{
TextField num1,num2,num3;
public Calculator(){
//创建三个文本框
num1 = new TextField(10);
num2 = new TextField(10);
num3 = new TextField(20);
Button button = new Button("=");
Label label = new Label("+");
//创建事件监听器
buttonActionListener listener = new buttonActionListener(num1,num2,num3);
button.addActionListener(listener);
//布局
setLayout(new FlowLayout(10));
add(num1);
add(label);
add(num2);
add(button);
add(num3);
pack();
setSize(480,70);
setBackground(new Color(255,213,123));
//监听鼠标事件,关闭frame
addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
setVisible(true);
}
}
class buttonActionListener implements ActionListener{
TextField num1,num2,num3;
public buttonActionListener(TextField num1, TextField num2, TextField num3) {
this.num1 = num1;
this.num2 = num2;
this.num3 = num3;
}
@Override
public void actionPerformed(ActionEvent e) {
int n1 = Integer.parseInt(num1.getText());
int n2 = Integer.parseInt(num2.getText());
num3.setText(""+(n1+n2));//把内容显示到文本框里边
num1.setText("");
num2.setText("");
}
}
(2)内部类写法
package 寒假训练.狂神.GUI;
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 TestCul {
public static void main(String[] args) {
new Calculator().loadFrame();
}
}
class Calculator extends Frame{
TextField num1,num2,num3;
public void loadFrame(){
//创建三个文本框
num1 = new TextField(10);
num2 = new TextField(10);
num3 = new TextField(20);
Button button = new Button("=");
Label label = new Label("+");
//创建事件监听器
buttonActionListener listener = new buttonActionListener();
button.addActionListener(listener);
//布局
setLayout(new FlowLayout(10));
add(num1);
add(label);
add(num2);
add(button);
add(num3);
pack();
setSize(480,70);
setBackground(new Color(255,213,123));
addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
setVisible(true);
}
private class buttonActionListener implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
int n1 = Integer.parseInt(num1.getText());
int n2 = Integer.parseInt(num2.getText());
num3.setText(""+(n1+n2));
num1.setText("");
num2.setText("");
}
}
}
(3)完全改造成面向对象
package 寒假训练.狂神.GUI;
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 TestCul {
public static void main(String[] args) {
new Calculator().loadFrame();
}
}
class Calculator extends Frame{
TextField num1,num2,num3;
public void loadFrame(){
//创建三个文本框
num1 = new TextField(10);
num2 = new TextField(10);
num3 = new TextField(20);
Button button = new Button("=");
Label label = new Label("+");
//创建事件监听器
buttonActionListener listener = new buttonActionListener(this);
button.addActionListener(listener);
//布局
setLayout(new FlowLayout(10));
add(num1);
add(label);
add(num2);
add(button);
add(num3);
pack();
setSize(480,70);
setBackground(new Color(255,213,123));
addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
setVisible(true);
}
}
class buttonActionListener implements ActionListener{
Calculator calculator ;
public buttonActionListener(Calculator calculator) {
this.calculator = calculator;
}
@Override
public void actionPerformed(ActionEvent e) {
int n1 = Integer.parseInt(calculator.num1.getText());
int n2 = Integer.parseInt(calculator.num2.getText());
calculator.num3.setText(""+(n1+n2));
calculator.num1.setText("");
calculator.num2.setText("");
}
}
3、Swing
3.1、鼠标花点
package 寒假训练.狂神.GUI;
import java.awt.*;
import java.awt.event.*;
import java.util.ArrayList;
import java.util.Iterator;
/*
创建鼠标监听事件
*/
public class TestMouseLisenter {
public static void main(String[] args) {
new MouseFrame("画花");
}
}
//自己的类
class MouseFrame extends Frame{
ArrayList points;
//画花需要画笔,需要监听鼠标的位置,需要用集合来存
public MouseFrame(String title){
super(title);
setBounds(200,200,400,300);
//存鼠标点击这个点
points = new ArrayList<>();
//鼠标监听器
this.addMouseListener(new MyMouseListener());
setVisible(true);
//关闭界面
addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
@Override
public void paint(Graphics g) {
//画画,监听鼠标事件
Iterator iterator = points.iterator();
while (iterator.hasNext()){
Point point = (Point)iterator.next();
g.setColor(Color.green);
g.fillOval(point.x,point.y,10,10);
}
}
//添加一个点
public void addPoint(Point point){
points.add(point);
}
/*
采用了适配器模式
因为 MouseLisenter是一个接口,不需要实现里边的全部接口
*/
private class MyMouseListener extends MouseAdapter {
//鼠标的事件有,按下、弹起、按住不放
@Override
public void mousePressed(MouseEvent e) {
MouseFrame source =(MouseFrame)e.getSource();
//这个点我们在点击时,就会在界面上
//这个点就是鼠标上的点
source.addPoint(new Point(e.getX(),e.getY()));
//每次重新画一遍,就是刷新
source.repaint();
}
}
}
3.2、弹窗
package 寒假训练.狂神.GUI;
//弹窗
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class TestDialog extends JFrame {
public TestDialog() {
this.setVisible(true);
this.setBounds(100,100,500,300);
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
//JFrame 放东西,容器
Container container = this.getContentPane();
container.setBackground(new Color(112, 179, 91));
container.setLayout(null);
//按钮
JButton jb = new JButton("点击弹出一个对话框");
jb.setBounds(30,30,200,100);
//当点击这个按钮时弹出一个对话框
jb.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
new MyDialog();
}
});
container.add(jb);
}
public static void main(String[] args) {
new TestDialog();
}
}
//弹出的对话框
class MyDialog extends JDialog {
public MyDialog() {
this.setVisible(true);
this.setBounds(100,100,500,500);
Container contentPane = this.getContentPane();
contentPane.setLayout(null);
JLabel label = new JLabel("老秦带你学Java");
label.setBounds(100,100,200,100);
label.setFont(new Font("黑体",2,20));
contentPane.setBackground(Color.red);
contentPane.add(label);
}
}
3.3、标签(Icon和ImageIcon)
package 寒假训练.狂神.GUI;
import javax.swing.*;
import java.awt.*;
import java.net.URL;
public class TestImageIcon extends JFrame {
public TestImageIcon() {
JLabel label = new JLabel("ImageIcon");
//当前这个类下边的图片地址
URL url = TestImageIcon.class.getResource("3.jpg");
ImageIcon icon = new ImageIcon(url);
label.setIcon(icon);
//居中
label.setHorizontalAlignment(SwingConstants.CENTER);
Container contentPane = getContentPane();
contentPane.add(label);
contentPane.setBackground(new Color(170, 255, 179));
setBounds(100,100,500,400);
setVisible(true);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new TestImageIcon();
}
}
3.4、JScroll面板
package 寒假训练.狂神.GUI;
import javax.swing.*;
import java.awt.*;
public class TestJScrollDemo extends JFrame {
public TestJScrollDemo(){
Container contentPane = this.getContentPane();
//文本域
TextArea textArea = new TextArea(30,100);
textArea.setText("欢迎学习秦老师说java");
//滑动面板
JScrollPane scrollPane = new JScrollPane(textArea);
contentPane.add(scrollPane);
setBounds(100,100,500,400);
setVisible(true);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new TestJScrollDemo();
}
}
3.5、JButton(单选框、复选框)
3.5.1、单选框
package 寒假训练.狂神.GUI;
import javax.swing.*;
import java.awt.*;
public class TestJButton extends JFrame {
public TestJButton() {
Container contentPane = this.getContentPane();
//单选框
JRadioButton rediobutton1 = new JRadioButton("rediobutton1");
JRadioButton rediobutton2 = new JRadioButton("rediobutton2");
JRadioButton rediobutton3 = new JRadioButton("rediobutton3");
//由于单选框只能选一个,分组,一个组里边只选一个
ButtonGroup buttonGroup = new ButtonGroup();
buttonGroup.add(rediobutton1);
buttonGroup.add(rediobutton2);
buttonGroup.add(rediobutton3);
contentPane.add(rediobutton1,BorderLayout.NORTH);
contentPane.add(rediobutton2,BorderLayout.CENTER);
contentPane.add(rediobutton3,BorderLayout.SOUTH);
setVisible(true);
setSize(400,200);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new TestJButton();
}
}
3.5.2、复选框
package 寒假训练.狂神.GUI;
import javax.swing.*;
import java.awt.*;
public class TestJButton extends JFrame {
public TestJButton() {
Container contentPane = this.getContentPane();
//复选框
JCheckBox checkBox1 = new JCheckBox("checkBox1");
JCheckBox checkBox2 = new JCheckBox("checkBox2");
JCheckBox checkBox3 = new JCheckBox("checkBox3");
contentPane.add(checkBox1,BorderLayout.NORTH);
contentPane.add(checkBox2,BorderLayout.CENTER);
contentPane.add(checkBox3,BorderLayout.SOUTH);
setVisible(true);
setSize(400,200);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new TestJButton();
}
}
4、贪吃蛇
我的素材是在阿里矢量图库里找的为32*32的,只有那个头是狂神的。
链接:https://pan.baidu.com/s/1RX_Ix-wsWDdRDAQvv2uULQ
提取码:leka
素材可以自己去阿里巴巴矢量图库去找:https://www.iconfont.cn/
狂神的原版素材:
链接:https://pan.baidu.com/s/13AUb-dErFOyiCKGriqhk7w
提取码:enz7
package 寒假训练.狂神.GUI.Snake;
import javax.swing.*;
import java.net.URL;
public class Data {
public static URL headerURL = Data.class.getResource("static/header.png");
public static ImageIcon header = new ImageIcon(headerURL);
public static URL upURL = Data.class.getResource("static/up.png");
public static ImageIcon up = new ImageIcon(upURL);
public static URL downURL = Data.class.getResource("static/down.png");
public static ImageIcon down = new ImageIcon(downURL);
public static URL leftURL = Data.class.getResource("static/left.png");
public static ImageIcon left = new ImageIcon(leftURL);
public static URL rightURL = Data.class.getResource("static/right.png");
public static ImageIcon right = new ImageIcon(rightURL);
public static URL foodURL = Data.class.getResource("static/food.png");
public static ImageIcon food = new ImageIcon(foodURL);
public static URL bodyURL = Data.class.getResource("static/body.png");
public static ImageIcon body = new ImageIcon(bodyURL);
}
package 寒假训练.狂神.GUI.Snake;
import javax.swing.*;
import java.awt.*;
public class StartGame {
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setBounds(10,10,960,800);
frame.setResizable(false);
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
//绘制游戏界面
frame.add(new GamePanel());
frame.setVisible(true);
}
}
package 寒假训练.狂神.GUI.Snake;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Random;
//游戏的面板
public class GamePanel extends JPanel implements KeyListener, ActionListener {
//定义蛇的数据结构
int length;//蛇的长度
int[] snakeX = new int[600];//蛇的X坐标
int[] snakeY = new int[500];//蛇的Y坐标
String fx ;//小蛇的方向
//食物的坐标
int foodX;
int foodY;
Random random = new Random();
int score;//成绩
//游戏当前的这状态,开始,结束
boolean isStart = false;//默认是不开始
boolean isFail = false;//游戏失败
//定时器
Timer timer = new Timer(100,this);//每100毫秒执行一次
public GamePanel() {
init();
//获得焦点和键盘事件
this.setFocusable(true);//获取焦点事件
this.addKeyListener(this);//获得空格事件
timer.start();//游戏一开始就需要启动定时器
}
//初始化方法
public void init(){
length = 3;
snakeX[0] = 128; snakeY[0] = 80;
snakeX[1] = 96; snakeY[1] = 80;
snakeX[2] = 64; snakeY[2] = 80;
fx = "R";//小蛇的初始方向
// 把食物随机分布在界面上
foodX = 32 + 32*random.nextInt(28);
foodY = 64 + 32*random.nextInt(21);
score = 0;
}
//绘制面板,游戏中的所有东西,都用这个笔来画
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);//清屏
//绘制静态面板
this.setBackground(Color.white);
Data.header.paintIcon(this,g,50,7);//头部广告栏
g.fillRect(32,64,896,672);//蛇的移动界面
//画食物
Data.food.paintIcon(this,g,foodX,foodY);
//画积分
g.setColor(Color.white);
g.setFont(new Font("微软雅黑",Font.BOLD,18));
g.drawString("长度:"+length,800,30);
g.drawString("分数:"+score,800,50);
//把小蛇放上去
if (fx.equals("R")){
Data.right.paintIcon(this,g,snakeX[0],snakeY[0]);
} else if (fx.equals("L")){
Data.left.paintIcon(this,g,snakeX[0],snakeY[0]);
}else if (fx.equals("U")){
Data.up.paintIcon(this,g,snakeX[0],snakeY[0]);
}else if (fx.equals("D")){
Data.down.paintIcon(this,g,snakeX[0],snakeY[0]);
}
for (int i = 1; i < length; i++) {
Data.body.paintIcon(this,g,snakeX[i],snakeY[i]);
}
//游戏状态
if (isStart==false){
g.setColor(Color.white);
g.setFont(new Font("微软雅黑",Font.BOLD,40));
g.drawString("按下空格开始游戏!!!",300,400);
}
if (isFail){
g.setColor(Color.RED);
g.setFont(new Font("微软雅黑",Font.BOLD,40));
g.drawString("游戏失败,按下空格重新开始游戏!!!",280,400);
}
}
//键盘监听器
@Override
public void keyPressed(KeyEvent e) {
int keyCode = e.getKeyCode();//获取键盘的按键是哪一个
if (keyCode==KeyEvent.VK_SPACE){//如果是空格
if (isFail){
isFail = false;
init();//重新开始
} else{
isStart = !isStart;//取反
}
repaint();
}
//小蛇移动
if (keyCode==KeyEvent.VK_UP){
fx = "U";
}else if (keyCode==KeyEvent.VK_DOWN){
fx = "D";
}else if (keyCode==KeyEvent.VK_LEFT){
fx = "L";
}else if (keyCode==KeyEvent.VK_RIGHT){
fx = "R";
}
}
//事件监听--->需要通过定时器实现
@Override
public void actionPerformed(ActionEvent e) {
if (isStart && isFail == false){//如果游戏是开始状态,就启动
//吃食物
if (snakeX[0]==foodX && snakeY[0]==foodY){
length++;
score += 10;//分数加10
//再次随机生成食物
foodX = 32 + 32*random.nextInt(28);
foodY = 64 + 32*random.nextInt(21);
}
for (int i = length-1;i > 0;i--){
snakeX[i] = snakeX[i-1];
snakeY[i] = snakeY[i-1];
}
if (fx.equals("R")){
snakeX[0]+=32;
if (snakeX[0]>896){ snakeX[0] = 32; }
} else if (fx.equals("L")) {
snakeX[0] -= 32;
if (snakeX[0] < 32) { snakeX[0] = 896; }
} else if (fx.equals("U")){
snakeY[0]-=32;
if (snakeY[0] < 64){ snakeY[0] = 704; }
}else if (fx.equals("D")){
snakeY[0]+=32;
if (snakeY[0] > 704){ snakeY[0] = 64; }
}
//失败判断
for (int i = 1; i < length; i++) {
if (snakeX[0] == snakeX[i]&&snakeY[0] == snakeY[i]){
isFail = true;
}
}
repaint();
}
timer.start();
}
@Override
public void keyTyped(KeyEvent e) { }
@Override
public void keyReleased(KeyEvent e) { }
}
java-GUI编程学习总结的更多相关文章
- JAVA GUI编程学习笔记目录
2014年暑假JAVA GUI编程学习笔记目录 1.JAVA之GUI编程概述 2.JAVA之GUI编程布局 3.JAVA之GUI编程Frame窗口 4.JAVA之GUI编程事件监听机制 5.JAVA之 ...
- Java GUI编程中AWT/swing/SWT的优缺点
http://www.cnblogs.com/dugang/archive/2010/10/22/1858478.html AWT AWT是Abstract Window Toolkit(抽象窗口工具 ...
- Java GUI编程4---标签组件JLabel
Java GUI编程4---标签组件JLabel 2018年06月11日 22:06:58 蓝蓝223 阅读数 12103更多 个人分类: Java书籍摘抄 所属专栏: Java Swing图形界面 ...
- Java并发编程学习前期知识下篇
Java并发编程学习前期知识下篇 通过上一篇<Java并发编程学习前期知识上篇>我们知道了在Java并发中的可见性是什么?volatile的定义以及JMM的定义.我们先来看看几个大厂真实的 ...
- java Gui编程 事件监听机制
1. GUI编程引言 以前的学习当中,我们都使用的是命令交互方式: 例如:在DOS命令行中通过javac java命令启动程序. 软件的交互的方式: 1. 命令交互方式 图书管理系统 ...
- java GUI编程二
java基础学习总结--GUI编程(二) 一.事件监听 测试代码一: 1 package cn.javastudy.summary; 2 3 import java.awt.*; 4 import j ...
- 学习笔记:java并发编程学习之初识Concurrent
一.初识Concurrent 第一次看见concurrent的使用是在同事写的一个抽取系统代码里,当时这部分代码没有完成,有许多的问题,另一个同事接手了这部分代码的功能开发,由于他没有多线程开发的经验 ...
- Java 网络编程学习总结
新手一枚,Java学习中,把自己学习网络编程的知识总结一下,梳理下知识,方便日后查阅,高手莫进. 本文的主要内容: [1] 网络编程认识 [2] TCP/IP编程 ...
- Java并发编程学习路线(转)
以前特地学过并发编程,但是没怎么学进去,不太喜欢.最近发现,作为一个资深工程师,却没有完整深入系统的学习过,而反是现在的BAT大并发是必须的,感觉甚是惭愧. 故找了一片学习文章,如下,准备集中一段时间 ...
- Java多线程编程(学习笔记)
一.说明 周末抽空重新学习了下多线程,为了方便以后查阅,写下学习笔记. 有效利用多线程的关键是理解程序是并发执行而不是串行执行的.例如:程序中有两个子系统需要并发执行,这时候需要利用多线程编程. 通过 ...
随机推荐
- 给dtcms增加模板自动生成功能
作为dtcms的使用者你是不是像我一样,也在不停的修改模板之后要点击生成模板浪费了很多开发模板的时间? 那就跟我一起给dtcms增加一个开发者模式,当模板修改完成之后,直接刷新页面就能看到效果,而不再 ...
- Ubuntu20.04 安装火狐开发者版本(水狐)步骤
1. 从Mozilla Firefox Developer Edition webpage下载. 2. 将下载的"tar.bz2"文件解压到指定目录, 例如/opt/firefox ...
- 通过js给某个标签添加内容或者删除标签
添加内容 //先保存div中原来的html var tag = document.getElementById("tag").innerHTML; //构造新的内容 var cou ...
- vue中computed/method/watch的区别
摘要:本文通过官方文档结合源码来分析computed/method/watch的区别. Tips:本文分析的源码版本是v2.6.11,文章中牵涉到vue响应式系统原理部分,如果不是很了解,建议先阅读上 ...
- .NET Core部署到linux(CentOS)最全解决方案,高阶篇(Docker+Nginx 或 Jexus)
在前两篇: .NET Core部署到linux(CentOS)最全解决方案,常规篇 .NET Core部署到linux(CentOS)最全解决方案,进阶篇(Supervisor+Nginx) 我们对. ...
- Trove自动钓鱼脚本(国际服
#WinActivateForce ; Script config. Do NOT change value here, might working inproperly! global Versio ...
- 获取本机IP和主机名
如果是在windows环境: 使用InetAddress.getLocalHost()方法即可 package com.datongsoft.wg.common.util; import java.n ...
- valgrind和Kcachegrind性能分析工具详解
一.valgrind介绍 valgrind是运行在Linux上的一套基于仿真技术的程序调试和分析工具,用于构建动态分析工具的装备性框架.它包括一个工具集,每个工具执行某种类型的调试.分析或类似的任务, ...
- ESRI,空间数据处理,WKT,GeoJson
ESRI,空间数据处理,WKT,GeoJson 一.WKT 二.GeoJson 三.WKT转GeoJson 四.GeoJson 转 WKT 一.WKT WKT(well-known text)是一种文 ...
- JS从后台获取数据,前台动态添加tr标签中的td标签
功能描述: 要求从后台查询该省份的所有城市,然后动态的再前台固定的tr标签中添加相应的td标签来展示城市基本信息: 文章目录 #一.前台jsp及js源码 jsp:在固定的tr标签中添加一个id,通过j ...