承接前面的内容:JAVA的基本学习第二部分
我们来学习Java的基本学习第三部分,这里主要记录文字与图形GUI设计
文字与图形GUI设计Î:
GUI设计概述:
JFC简介:
JFC主要包括以下组件:
AWT组件:早期的窗口组件包,提供构造窗口的基本需求,例如按钮、文本框、复选框、对话框、菜单等。
Swing组件:新的窗口组件包(AWT中所有组件均能在Swing中找到对等体并有很大改进),Swing组件都是AWT的Container类的直接子类和间接子类。
Java 2D API:扩展了java.awt和java.awt.Image类,它为Java应用程序提供了一套二维图形图像处理的类,并提供了丰富的绘图风格
Drag and Drop API:使用户能够在两个应用程序之间实现与平台无关的拖放功能
Accessibility API:提供更先进的沟通界面,例如语音输入、触摸式屏幕等
Java中构成图形用户界面的各种元素和成分可以粗略地分为三类:容器、控制组件和用户自定义成分。
- 容器:用来组织或容纳其他界面成分和元素的组件
- 控制组件:图形用户界面的最小单位之一,作用是完成与用户的一次交互
- 用户自定义成分:编程人员根据自己的需要,使用各种字型、字体、色彩设计一些几何图形、标志图案等
Swing组件:
轻量级组件:
继承自JComponent抽象类的组件,是实现人机交互的基本组件,他们必须放到重量级组件上才能显示.
重量级组件:
顶级组件或顶级容器,有JFrame、JDialog、JWindow和JApplet四个。任何Swing应用程序中必须至少有一个重量级组件。重量级组件都与AWT类有关。
Swing容器的结构:
每一个顶级容器都含有根面板
- 透明面板:位于JRootPane中所有其他组件之上,完全透明。主要功能是捕获鼠标事件和为在所有组件上绘图提供方便
- 分层面板:如同一个多层置物架,在每一层上可以添加组件,但上面的物品会遮住下面的物品
- 内容面板:也称为最底层或FrameContent层,是顶级容器的内容面板。加入Swing组件时。可利用getContentPane()方法得到contentPane()容器,再利用add()方法将组件添加到容器中。
- 菜单条:可有可无
轻量级组件常用可分为:
- 中间容器
- 专用容器
- 基本组件
JRootPane常用的成员方法:
Container getContentPane() //返回contentPane
Component getGlassPane() //返回glassPane
JLayeredPane getLayeredPane() //返回layeredPane
JRootPane getRootPane() //返回此组件的单个JRootPane子组件
//"contentPane"是应用程序特定组件的主要容器
void setContentPane(Container contentPane)
//glassPane始终为rootPane的第一个子组件
//rootPanes 布局管理器确保它始终与rootPane一样大
void setGlassPane(Component glassPane)
//管理contentPane的Container,在某些情况下为菜单栏
void setLayeredPane(JLayeredPane layeredPane)
将组件添加到顶级容器中的方法
把Swing组件放入一个Swing顶层容器的内容面板上,避开使用非Swing的重量级组件。可以使用两种方法在JFrame和JApplet等顶级容器中添加组件
- 利用getContentPane()方法获得当前容器的面板对象,再引用容器的add()方法来加入其它组件。例如,frame.getContentPane().add(childComponent)
- 先建立一个JPanel之类的中间容器,把组件添加到容器中,然后引用setContentPane()方法把该容器置为顶级容器的内容面板。例如:
JPanel contentPane=new JPanel() //建立一个JPanel容器
…… //把其它组件添加到Jpanel中
//把contentPane的对象放到frame的内容面板里
frame.setContentPane(contentPane)
控制Applet运行状态的基本方法:
Applet是一种执行于Web浏览器的小程序。
Applet应用程序的执行过程及其所引用的方法如下:
init():创建JavaApplet且第一次使用支持Java的浏览器载入时,执行
start():运行init()方法后自动调用,且每当用户离开该Applet主页后又再次返回时,或者当浏览器从图标状态恢复为窗口时,系统又会再调用一遍
paint():是container类的方法,浏览器首次显示Applet时,用户调整窗口大小或移动窗口时,都会调用此方法,另外当repaint()方法被调用时,系统将首先调用update()方法将Applet对象所占用的屏幕空间清空,然后调用paint()方法重画
stop():当用户将浏览Applet程序所在的Web页面切换到其他页面时,浏览器会自动调用stop()方法,让程序停止运行,用户回来后,浏览器重新启动Applet程序的start()方法
destroy()方法:当浏览器正常关闭时,自动执行此方法,释放占用资源
Graphics2D对象:
Graphics2D对象可以输出三种图形对象:
- shape(形状)图形对象
- text(文本)图形对象
- image(图像)图形对象
Graphics2D对象的属性设置:
- Paint属性:用于设置要绘制的图形或文字的颜色
- Stroke属性:通过setStroke()方法控制图形轮廓线的形状
- Font属性:用于设置输出文本的字体
- Transform属性:实现图形的缩放、旋转、移位等
- Composite rule属性:描述绘图操作如何与存在的背景相复合
- Clipping space属性:设置剪切区域,即它将绘图限制在一个设定的区域内,使绘图在这个区域外无效。
绘制文字:
基本成员方法:
使用Graphics类和Graphics2D类(Graphics类的子类)提供的绘制文字的成员方法
绘制方法:
//在x,y处绘制字符串
drawString(String string,int x,int y)
//在x,y处,从ch的第offset开始取number个字符绘制
drawChars(char[] ch,int offset,int number,int x,int y)
//在x,y处,从by的第offset开始取number个字节绘制
drawBytes(byte[] by,int offset,int number,int x,int y)
下面给出使用Graphics类的示例
package 测试;
import java.awt.Graphics;
import javax.swing.JApplet;
public class test extends JApplet
{
private String s="welcome";
private char c[]= {'T','O','a','e','t'};
private byte b[]= {'d','4','X','I','\047','A','N'};
public void paint(Graphics g)
{
g.drawString(s, 50, 25);
g.drawChars(c, 0, 2, 50, 50);
g.drawBytes(b, 2, 5, 50, 75);
}
}
Font类:
构造方法:
使用Font类构造方法创建Font对象:
Font(String fontname,int style,int size)
fontname:字型名,如宋体、黑体、楷体、Arial、Courier
style:字体样式,如粗体(BOLD)、斜体(ITALIC)、正常体(PLAIN)
size:用像素点处理的字体大小
Font类的成员方法:
//使用传递进来的名称获得指定的字体
static Font decode(String str)
//获得指定平台的字体名
String getFamily()
//获得字体的名称
String getName()
//获得字体的样式
int getStyle()
//获得字体的大小
int getSize()
//将此对象转换为一个字符串表示
String toString()
设置字体:
可以用java.awt.Graphics类的成员方法来设置自己希望使用的字体,格式如下:
setFont(Font myFont)
绘制字体实例:
package 测试;
import java.awt.Graphics;
import java.awt.Font;
import java.awt.Graphics2D;
import javax.swing.JApplet;
public class test extends JApplet
{
Font f1=new Font("TimesRoman",Font.BOLD,16); //TimesRoman字体,加粗
Font f2=new Font("Courir",Font.ITALIC,24); //Courir字体,斜体
Font f3=new Font("Helvetica",Font.PLAIN,14); //常规
public void paint(Graphics g)
{
Graphics2D g2=(Graphics2D)g;
g2.setFont(f1);
g2.drawString("是-哈希", 20, 50);
g2.setFont(f2);
g2.drawString("是-哈希", 20, 100);
g2.setFont(f3);
g2.drawString("是-哈希", 20, 150);
}
}
Color类:
构造方法:
//使用0~255的整数构造
Color(int r,int g,int b)
//使用0~1的浮点数作为比例构造
Color(float r,float g,float b)
//使用指定的RGB值创建一个Color对象
Color(int rgb)
Color类成员方法:
//获得对象的红色值
int getRed()
//获得对象的绿色值
int getGreen()
//获得对象的蓝色值
int getBlue()
//获得对象的RGB值
int getRGB()
//获取此颜色的一种更亮版本
Color brighter()
//获取此颜色的一种更暗版本
Color darker()
此外还有一些java.awt.Graphics等的方法
//设置Graphics2D上下文的背景色
setBackground(Color a)
//设定图形上下文的当前颜色
setPaint(new Color(int r,int g,int b))
setColor(new Color(int r,int g,int b))
下面是改变颜色实例:
package 测试;
import java.awt.Graphics;
import java.awt.Color;
import java.awt.Graphics2D;
import javax.swing.JApplet;
public class test extends JApplet
{
public void paint(Graphics g)
{
Graphics2D g2=(Graphics2D)g;
int red,green,blue;
red=255;
blue=0;
green=0;
//设置前景颜色
g2.setPaint(new Color(red,green,blue));
//设置背景颜色
getContentPane().setBackground(Color.GREEN);
super.paint(g2);
g2.drawString("Welcome to Xi\047an",25,75);
//状态行显示绘图文字颜色信息
showStatus("Current RGB:"+g2.getPaint().toString());
}
}
绘制形状图形:
绘制线段和矩形:
通过构造方法来实现画图:
绘制直线、二次曲线及三次曲线
package 测试;
import java.awt.*;
import java.awt.geom.*;
import javax.swing.*;
class drawPanel extends JPanel
{
public void paintComponent(Graphics g)
{
Graphics2D g2=(Graphics2D)g;
//直线,确定两个点即可
Line2D.Double Line1=new Line2D.Double(20.0,20.0,80.0,40.0);
//二次曲线,确定三个点,中间生成弧度,实现二次曲线
QuadCurve2D.Double Line2=new QuadCurve2D.Double(130.0,30.0,
150.0,50.0,
170.0,20.0);
//三次曲线,确定四个点,中间有两个弧
CubicCurve2D.Double Line3=new CubicCurve2D.Double(220.0,40.0,
240.0,60.0,
260.0,20.0,
300.0,35.0);
getRootPane().setBackground(Color.cyan); //设置背景颜色
g2.setPaint(Color.red); //设置前景颜色
g2.draw(Line1);
g2.draw(Line2);
g2.draw(Line3);
}
}
public class test
{
public test()
{
//设置窗体图标显示为默认方式
JFrame.setDefaultLookAndFeelDecorated(true);
JFrame f=new JFrame("draw Line"); //创建窗体对象
//点击窗口关闭图标关闭窗口
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
drawPanel pa=new drawPanel(); //创建容器JPanel类pa的对象
pa.setPreferredSize(new Dimension(350,100)); //pa的大小
Container cp=f.getContentPane(); //创建一个返回此窗体的contentPane对象
//cp的容器布局为BorderLayout,添加pa的对象到cp的容器中并居中
cp.add(pa,BorderLayout.CENTER);
f.pack(); //调整窗口
f.setVisible(true); //设置窗口为可见
}
public static void main(String[] args)
{
new test();
}
}
绘制各种矩形:
package 测试;
import java.awt.*;
import java.awt.geom.*;
import javax.swing.JApplet;
public class test extends JApplet
{
public void paint(Graphics g)
{
Graphics2D g2=(Graphics2D)g;
g2.setPaint(Color.red); //设置前景颜色
//绘制标准矩形对象
Rectangle2D.Double rec=new Rectangle2D.Double(20,20,60,30);
g2.draw(rec);
g2.setStroke(new BasicStroke(4)); //设置线宽
//设置圆角矩形对象
//参数信息:100,20处画长60,高30的矩形,每个角宽少10,高少10凹进去
g2.draw(new RoundRectangle2D.Double(100,20,60,30,10,10));
g2.setPaint(Color.blue); //设置前景颜色
//绘制填充的矩形对象
g2.fill(new Rectangle2D.Double(20,80,60,30));
g2.setStroke(new BasicStroke(4)); //设置线宽
//绘制填充的圆角矩形对象
g2.fill(new RoundRectangle2D.Double(100,80,60,30,10,10));
}
}
绘制椭圆、圆、扇形:
package 测试;
import java.awt.*;
import java.awt.geom.*;
import javax.swing.JApplet;
public class test extends JApplet
{
public void paint(Graphics g)
{
Graphics2D g2=(Graphics2D)g;
g2.setPaint(Color.red); //设置前景颜色
g2.setStroke(new BasicStroke(2)); //设置线宽
//绘制弧
g2.draw(new Arc2D.Double(15,15,80,80,60,125,Arc2D.OPEN));
g2.draw(new Arc2D.Double(100,15,80,80,60,125,Arc2D.CHORD));
g2.draw(new Arc2D.Double(200,15,80,80,60,125,Arc2D.PIE));
g2.fill(new Arc2D.Double(280,15,80,80,60,125,Arc2D.OPEN));
//绘制圆及椭圆
g2.setPaint(Color.lightGray); //设置前景颜色
//四个参数确定一个矩形
Ellipse2D.Double e1=new Ellipse2D.Double(15,120,100,50);
Ellipse2D.Double e2=new Ellipse2D.Double(150,120,80,80);
g2.fill(e2);
g2.setPaint(Color.black);
g2.setStroke(new BasicStroke(6));
g2.draw(e1);
g2.draw(e2); //给e2加个黑边
}
}
这里说一下Arc2D.Double构造方法的参数作用:
Arc2D.Double(double x,
double y,
double w,
double h,
double start,
double extent,
int type)
x,y,w,h框出一个矩形,start为起始角度,extent为弧角度,type为连接类型
连接类型:OPEN(两点无弧)、CHORD(两点直弧)、PIE(两点弯弧)
参照图:
绘制多边形:
package 测试;
import java.awt.*;
import java.awt.geom.*;
import javax.swing.JApplet;
public class test extends JApplet
{
public void paint(Graphics g)
{
Graphics2D g2=(Graphics2D)g;
g2.setPaint(Color.red); //设置前景颜色
//设置第一个多边形的xy坐标
int x1[]= {20,40,50,30,20,15,20};
int y1[]= {20,20,30,50,50,30,20};
//设置第二个多边形的xy坐标
int x2[]= {90,110,100,80,70,65,60,70};
int y2[]= {90,110,80,100,100,80,60,70};
//设置第三个多边形的xy坐标
int x3[]= {190,218,150,230,162};
int y3[]= {20,100,46,46,100};
//创建几何图形的路径对象
GeneralPath polygon=new GeneralPath(0,x1.length+x2.length);
//画第一个部分
polygon.moveTo(x1[0], y1[0]);
for(int index=1;index<x1.length;index++)
{
//将准备从当前位置画直线的点的坐标添加到对象polygon中
polygon.lineTo(x1[index], y1[index]);
}
//第二个部分
polygon.moveTo(x2[0], y2[0]);
for(int index=1;index<x2.length;index++)
{
//将准备从当前位置画直线的点的坐标添加到对象polygon中
polygon.lineTo(x2[index], y2[index]);
}
//设置从笔当前位置画直线到最后一次抬笔的位置
polygon.closePath();
g2.draw(polygon); //画这个多边形
//画五角星
GeneralPath polygon2=new GeneralPath(0,x3.length);
polygon2.moveTo(x3[0], y3[0]);
for(int index=1;index<x3.length;index++)
{
polygon2.lineTo(x3[index], y3[index]);
}
g2.fill(polygon2);
}
}
图形重叠的色彩设置:
Java2D提供的Composite(混合成的)和CompositeContext(合成文本)两种接口构成了图形对象间颜色复合模式的基础。其中,实现Composite接口的类是AlphaComposite。
绘制复合图形:
package 测试;
import java.awt.*;
import java.awt.geom.*;
import javax.swing.JApplet;
public class test extends JApplet
{
public void paint(Graphics g)
{
Graphics2D g2=(Graphics2D)g;
Rectangle2D.Double rec1=new Rectangle2D.Double(0,0,100,100),
rec2=new Rectangle2D.Double(50,0,100,100),
rec3=new Rectangle2D.Double(125,75,100,100),
rec4=new Rectangle2D.Double(50,125,100,100),
rec5=new Rectangle2D.Double(-25,75,100,100);
g2.setPaint(Color.red); //前景颜色
//将用户坐标系(0,0)平移到屏幕坐标系(100,50)像素点的位置
g2.translate(100, 50);
//图形旋转45度
g2.rotate((45*java.lang.Math.PI)/180);
//绘制图形
g2.fill(rec1);
//创建仿射变换对象,设置几何图形变换为默认方式(还原对刚才坐标系的改变)
g2.setTransform(new AffineTransform());
//创建一个AlphaComposite类ac的复合对象,百分之五十的透明度
AlphaComposite ac=AlphaComposite.getInstance(AlphaComposite.SRC_OVER,0.5f);
//设定重叠对象的颜色重叠方式
g2.setComposite(ac);
g2.setPaint(Color.green); //前景颜色
g2.fill(rec2);
g2.setPaint(Color.blue); //前景颜色
g2.fill(rec3);
g2.setPaint(Color.yellow); //前景颜色
g2.fill(rec4);
g2.setPaint(Color.pink); //前景颜色
g2.fill(rec5);
}
}
绘制剪切文字图形:
Java2DAPI中提供了文字图形的剪切功能,该功能通过在图形环境中设置一个剪切形状,来将所有的绘图操作限制在该剪切形状的内部进行。
package 测试;
import java.awt.*;
import java.awt.font.*;
import java.awt.geom.*;
import javax.swing.JApplet;
public class test extends JApplet
{
private Shape clipShape;
public void paint(Graphics g)
{
Graphics2D g2=(Graphics2D)g;
clipShape=makeClipShape(g2);
g2.draw(clipShape);
g2.clip(clipShape); //剪切文字图形
final int NLINES=90;
Point2D p=new Point2D.Double(0,0);
for(int i=0;i<NLINES;i++)
{
double x=(2*getWidth()*i)/NLINES;
double y=(2*getHeight()*(NLINES-1-i))/NLINES;
Point2D q=new Point2D.Double(x,y);
//设置剪切的形状,绘制一组线条
g2.draw(new Line2D.Double(p,q));
}
}
Shape makeClipShape(Graphics2D g2)
{
//创建字体绘制环境对象
FontRenderContext context=g2.getFontRenderContext();
Font f=new Font("隶书",Font.PLAIN,80);
//创建文本图形的路径对象
GeneralPath clipShape=new GeneralPath();
//创建文本布局对象
TextLayout layout=new TextLayout("你好!",f,context);
//将用户坐标系的基点移到屏幕坐标系(0,80)处
AffineTransform transform=AffineTransform.getTranslateInstance(0, 80);
//创建图形对象,该对象是文本布局对象的图形轮廓对象
Shape outline=layout.getOutline(transform);
//添加指定的图形对象到路径对象中
clipShape.append(outline,false);
layout=new TextLayout("再见!",f,context);
transform=AffineTransform.getTranslateInstance(0, 170);
outline=layout.getOutline(transform);
//设置false表示在第一个图形画完后,抬笔再画第二个图形
clipShape.append(outline, false);
return clipShape;
}
}
博客:is-hash.com
商业转载 请联系作者获得授权,非商业转载 请标明出处,谢谢