Java的基本学习第三部分——文字与图形GUI设计

承接前面的内容: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;
	}
}

 

 

 

 

 

 

 

商业转载 请联系作者获得授权,非商业转载 请标明出处,谢谢

发表评论