足球搜索文件学习(一)

mac2022-10-06  25

https://github.com/LARG/utaustinvilla3d# 足球搜索文件之gui包

基于包文件gui的图形操作界面的相关学习

对于gui中java.awt包的初识

java.awt是一个软件包,包含用于创建用户界面和绘制图形图像的所有分类。在AWT术语中,诸如按钮或滚动条之类的用户界面对象称为组件。Component类是所有 AWT 组件的根。 当用户与组件交互时,一些组件会激发事件。AWTEvent 类及其子类用于表示 AWT 组件能够激发的事件。有关 AWT 事件模型的描述,请参见 AWTEvent。容器是一个可以包含组件和其他容器的组件。容器还可以具有布局管理器,用来控制容器中组件的可视化布局。AWT 包带有几个布局管理器类和一个接口,此接口可用于构建自己的布局管理器。 功能:包含用于创建用户界面和绘制图形图像的所有类。

import java.awt.Color; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.geom.AffineTransform; import java.awt.geom.Arc2D; import java.awt.geom.Ellipse2D; import java.awt.geom.Line2D; import java.awt.geom.Rectangle2D;

Color : Color类用于封装默认 sRGB 颜色空间中的颜色,或者用于封装由ColorSpace标识的任意颜色空间中的颜色。

Graphics:Graphics 类是所有图形上下文的抽象基类,允许应用程序在组件(已经在各种设备上实现)以及闭屏图像上进行绘制。

Graphics2D:此 Graphics2D 类扩展Graphics类,以提供对几何形状、坐标转换、颜色管理和文本布局更为复杂的控制。

RenderingHints:RenderingHints 类定义和管理键和关联值的集合,它允许应用程序将输入提供给其他类使用的算法选择,这些类执行呈现和图像处理服务。 MouseEvent:指示组件中发生鼠标动作的事件。

geom.AffineTransform:AffineTransform 类表示 2D 仿射变换,它执行从 2D 坐标到其他 2D 坐标的线性映射,保留了线的“直线性”和“平行性”。

geom.Arc2D:Arc2D 是所有存储 2D 弧度的对象的抽象超类,其中 2D 弧度由窗体矩形、起始角度、角跨越(弧的长度)和闭合类型(OPEN、CHORD 或 PIE)定义。

geom.Ellipse2D:Ellipse2D 类描述窗体矩形定义的椭圆。

geom.Line2D:Line2D 表示 (x,y) 坐标空间中的线段。

geom.Rectangle2D:Rectangle2D 类描述通过位置 (x,y) 和尺寸 (w x h) 定义的矩形。

import javax.swing.JPanel;

JPanel:JPanel是一个通用的轻量级容器。

public class FieldCanvas extends JPanel implements MouseListener, Constants { public static final long serialVersionUID = 123;//定义一个常量serialVersionUID double xcenter, ycenter, width, height;//x中心,y中心,宽度和高度 double scaleFactorX, scaleFactorY;//scaleFactor比例因素,x的比例因素,y的比例因素

这个源文件中唯一的public类FieldCanvas继承(extends)swing的JPanel并实现了MouseListener和Constants接口(Constants接口位于simuro包中,“import simuro.Constants;”导入)

public FieldCanvas()//构造方法 { this.setBackground(new Color(100, 200, 50));// this.addMouseListener(this);//添加鼠标监听器 }

在构造方法中,设置背景颜色并添加了MouseListener

通过Color构造函数自定义颜色

Color的构造函数:

Color(int,int,int): 指定RGB值0~255,alpha通道为默认值255,即不透明。 Color(int,int,int,int): 指定RGB、alpha通道的值,0~255。 Color(int): 指定RGB值,其中int转换为16进制表示形式,0xff000000,其中ff为alpha通道,为默认值255,16~23 bit 为R,8~15 bit 为G,0~7 bit 为B。 **Color(int, boolean): 如果boolean只为True,则int值转换为包含alpha通道的16进制,24~32 bit 为alpha通道值,否则alpha通道值为255。 Color(float,float,float): 指定RGB值,范围0.0~1.0,alpha通道默认为1.0。 Color(float,float,float,float): 指定RGB、alpha通道的值,范围为0.0~1.0。 Colr(ColorSpace,float[],float): 三个参数分别为颜色空间、各通道颜色值组成的数组,alpha通道值,其中float[]数组中元素的个数取决于颜色空间,如RGB颜色空间为3,CMYK颜色空间为4。

Color对象的方法: getRed(): 获取Red通道的值。 getGreen(): 获取Green通道的值。 getBlue(): 获取Blue通道的值。 getAlpha(): 获取alpha通道的值。 getRGB(): 获取颜色的RGB、alpha通道的值,转换为16进制后,24~31 bit为alpha通道,16~23 bit 为red,8~15 bit 为green通道,0~6 bit 为blue通道。 brighter(): 返回一个比当前颜色浅一级的Color对象。 darker(): 返回一个比当前颜色深一级的Color对象 equals(Object): 比较两个颜色对象是否颜色相同。 getColor(String): 获取某个字符串的系统属性的值,所对应的颜色,返回一个Color对象,否则返回null。 getColor(String,Color): 同上,如果Sring对应的系统属性值为null,则返回Color值。 getColor(String,int): 同上,否则返回int值所对应的Color对象。 getColorSpace(): 返回颜色空间。 HSBtoRGB(float,float,float): 从HSB空间转换到RGB空间,返回RGB空间对应的int值,不含alpha通道。 RGBtoHSB(): 从RGB空间转换到HSB空间,返回HSB空间对应的float值,不含alpha通道。

重写JPanel中的paintComponent方法,并以Graphics对象g作为参数

public void paintComponent(Graphics g) { super.paintComponent(g); RenderingHints renderHints = new RenderingHints(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); renderHints.put(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); Graphics2D g2d = (Graphics2D) g; // always! g2d.setRenderingHints(renderHints); width = (float) this.getSize().width - 100; height = (float) this.getSize().height - 100; xcenter = (float) (this.getSize().width - 100) / 2; ycenter = (float) (this.getSize().height - 100) / 2; g2d.translate(50.0, height + 50); // Move the origin to the lower left g2d.scale(1.0, -1.0); // Flip the sign of the coordinate system scaleFactorX = width / FIELD_WIDTH; scaleFactorY = height / FIELD_HEIGHT; // call method to paint the lines of the field paintField(g2d); drawRobot(g2d); drawOpponent(g2d); drawBall(g2d); } super.paintComponent(g); RenderingHints renderHints = new RenderingHints(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); renderHints.put(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);

RenderingHints类定义和管理键和关联值的集合,这些集合允许应用程序为java.awt提供性能呈现和图像处理服务的其他类所使用的算法提供输入选择。Graphics2D类,以及实现java.awt.image的类和java.awt.image。RasterOp都提供方法来获取并可能设置renderinghintskey的个体或组及其相关值。当这些实现执行任何渲染或图像处理操作时,它们应该检查调用者所请求的任何渲染的值,并相应地调整所使用的算法,以达到最佳效果。

width = (float) this.getSize().width - 100; height = (float) this.getSize().height - 100; xcenter = (float) (this.getSize().width - 100) / 2; ycenter = (float) (this.getSize().height - 100) / 2;

以维度对象的形式返回此组件的大小。维度对象的heightfield包含该组件的高度,而widthfield包含该组件的宽度。这里对width,heigh,xcenter,ycenter进行了相应的设置和更改。

Graphics2D g2d = (Graphics2D) g; // always! g2d.setRenderingHints(renderHints); g2d.translate(50.0, height + 50); // 将原点移动到左下方 g2d.scale(1.0, -1.0); // 翻转坐标系的符号

创建Graphics2D的对象,进行绘图。

java2D绘图流程

如果要绘制一个形状,可以按照如下步骤操作: 1)获得一个Graphics2D类的对象,该类是Graphics类的子类。 public void paintComponent() { Graphics2D g2 = (Graphics2D) g; } 2)使用setRenderingHints方法来设置绘图提示,它提供了速度与绘图质量之间的一种平衡。 RenderingHits hints = …; g2.setRenderingHints(hints); 3)使用setStroke方法来设置笔划,笔划用于绘制形状的边框。可以选择边框的粗细和线段的虚实。 Stroke stroke = …; g2.setStroke(stroke); 4)使用setPaint方法来设置着色方法。着色方法用于填充诸如笔划路径或者形状内部等区域的颜色。可以创建单色的着色法,也可

以用变化的色调进行着色,或者使用平铺的填充模式。 Paint paint = …; g2.setPaint(paint); 5)使用clip方法来设置剪切区域。 Shape clip = …; g2.clip(clip); 6)使用transform方法,设置一个从用户空间到设备空间的变换方式。如果使用变换方式比使用像素坐标更容易地定义在定制坐标系

paintField(g2d); drawRobot(g2d); drawOpponent(g2d);//Opponent:对手 drawBall(g2d);

这里直接调用这个类中的paintField,drawRobot,drawOpponent,drawBall方法 将球场,机器人,对手,以及球画出来。

下面依次介绍paintField、drawRobot、drawOpponent、drawBall

这个四个方法都是基于Graphics2D的对象进行一定的绘画。

public void paintField(Graphics2D g2d) { g2d.setColor(Color.white); // 设置环境 g2d.draw(new Rectangle2D.Double(0, 0, width, height)); g2d.draw(new Line2D.Double(xcenter, 0, xcenter, height)); g2d.draw(new Ellipse2D.Double(xcenter - 500 * scaleFactorX, ycenter - 500 * scaleFactorY, 1000 * scaleFactorX, 1000 * scaleFactorY)); g2d.draw(new Arc2D.Double(-400 * scaleFactorX, ycenter - 400 * scaleFactorY, 800 * scaleFactorX, 800 * scaleFactorY, -90, 180, 0)); g2d.draw(new Arc2D.Double(-400 * scaleFactorX + width, ycenter - 400 * scaleFactorY, 800 * scaleFactorX, 800 * scaleFactorY, 90, 180, 0)); }

Line2D.Double用来绘画一段线段。 Arc2D.Double用来绘画圆弧。 Ellipse2D.Double用来绘画椭圆。 通过具体的数据在绿色的背景下绘画了一个白色线条的足球场,包含左右两个区域以及左右守门的地方,并在中间有一个椭圆。

public void drawRobot(Graphics2D g2d) { Color[] colors = { Color.blue, Color.cyan, Color.magenta, Color.orange, Color.red }; for (int i = 0; i < OWNROBOTCOUNT; i++) { g2d.setColor(colors[i]); // setting context AffineTransform saveXform = g2d.getTransform(); g2d.translate((Main.robots[i].getPosx()) * scaleFactorX, (Main.robots[i].getPosy()) * scaleFactorY); g2d.rotate(Math.PI); g2d.scale(-1, 1); g2d.draw(new Ellipse2D.Double(-90 * scaleFactorX, -90 * scaleFactorY, 180 * scaleFactorX, 180 * scaleFactorY)); String s = "R" + Integer.toString(i + 1); g2d.drawString(s, -6, 5); Line2D line = new Line2D.Double(0, 0, 30, 0); g2d.rotate(-Main.robots[i].getOrientation()); g2d.draw(line); g2d.setTransform(saveXform); } }

这段代码同样运用Graphics2D的对象g2d进行绘画了机器人的形状,在最开始的定义了几个机器人的颜色,并用for循环绘画出了每个机器人的形状,他们的形状都是相同的,但是颜色不同,为的是区别每个机器人。

public void mouseClicked(MouseEvent e) { double upscaleFactorX = FIELD_WIDTH / width; double upscaleFactorY = FIELD_HEIGHT / height; int x = (int) ((e.getX() - 50) * upscaleFactorX); int y = (int) (FIELD_HEIGHT - ((e.getY() - 50) * upscaleFactorY)); }

这段代码主要是处理鼠标点击事件。

double upscaleFactorX = FIELD_WIDTH / width; double upscaleFactorY = FIELD_HEIGHT / height; int x = (int) ((e.getX() - 50) * upscaleFactorX); int y = (int) (FIELD_HEIGHT - ((e.getY() - 50) * upscaleFactorY));

这里是规定鼠标点击合理的范围,避免对机器人或者球产生了错误的操作,例如将球放在边界以外,或者将球放在敌方的球门内。

总结

通过包文件gui中FieldCanvas.java文件,初步了解了awt包中的一部分类,了解到了如何设置环境背景以及Color的用法,也通过下面几个绘画场地,机器人,足球的方法中了解到了Graphics2D类的部分绘图方法,了解到了绘画圆弧、线段、椭圆等方法。以及最后对鼠标事件的处理,如何使鼠标点击在合理的地方。对paintComponent方法了解得不是很清楚,之后需要加强对组件的学习。

最新回复(0)