[java桌面应用开发]Graphics类的基本功能————(2020.4.24学习笔记)

目录

第一节 Graphics类的基本功能
第二节 实例演示

01 Graphics类的基本功能

Java标准类库提供了许多类用来显示并管理图形信息,java.awt包中的Graphics类是所有图形处理的基础。Graphics类是所有图形上下文的抽象父类,允许应用程序在组件以及屏幕图像上进行绘制。这个类提供的功能有:建立字体、设定显示颜色、显示图像和文本、绘制和填充各种几何图形等。由Graphics对象记录针对绘制图形和文本的一系列设置。除了控制组件的颜色和显示文本的字体之外,当需要的时候,也可以在组件上绘制图形。当先后绘图的图形有重叠时,如何确定重叠部分的颜色呢?这称为绘图模式。
  绘图模式主要有两种,分别是正常模式和异或模式。正常模式下,后绘制的图形覆盖先绘制的图形,使得先绘制的图形被重叠的部分不再可见;异或模式下,当前绘制的颜色、先前绘制的颜色及所选定的某种颜色之间进行某种处理,使用得到的新颜色值进行绘制。
  java.awt.Graphics类中设置绘图模式的方法如下。
  • setPaintMode( ):将此图形上下文的绘图模式设置为正常模式,这是默认模式。
  • setXORMode(Color c):将此图形上下文的绘图模式设置为异或模式,参数c指定了绘制对象时与窗口进行异或操作的颜色。选择异或模式下,如果使用同一颜色绘制两遍,则相当于擦除第一次绘制的图形,也即恢复原来的状态。
  所有绘制都必须通过一个图形对象完成。可以直接在框架(Frame)中显示文本信息,也可以直接在框架中绘图。在某个组件中绘图,一般应该为这个组件所属的子类重写paint( )方法,在该重写的方法中进行绘图。但要在JComponent子类的组件中绘图,应重写paintComponent( )方法,在该方法中进行绘图。例如,继承定义一个文本区子类,要在这样的文本区子对象中绘图,就应该重写这个文本区子类的paintComponent( )方法。系统自动为程序提供图形对象,并以参数g传递给paint( )方法和paintComponent( )方法。
  比如,JPanel非常适合于绘制自定义图形,其图形对象是作为paintCompcment( )方法的参数获得的。通常的做法是,首先在一个面板中进行绘制,然后再将这个面板添加到框架中。要创建自定义图形,需要由JPanel类派生一个新类,并重写父类的paintComponent( )方法。
  public void paintComponent(Graphics g){
  …//将在这里通过参数g编写绘制代码
  }
  paintComponent方法包含一个Graphics类型的参数。可以从图形对象或使用Component的getGraphics( )方法得到Graphics对象。java.awt.Component类中定义了paint(Graphics g)方法,当组件被显示出来时,将调用该方法。java.awt.Component中还定义了一个repaint( )方法,每当需要重绘组件时,可以调用该方法,该方法将自动调用paint(Graphics g)。javax.swing.JComponent继承java.awt.Component,并重写了paint(Graphics g)方法。
  在javax.swing.JComponent的paint(Graphics g)方法中,会调用如下3个方法。
  • paintComponent(Graphics g):绘制组件。
  • paintBorder(Graphics g):绘制组件的边框。
  • paintChildren(Graphics g):绘制组件中的子组件。
  通常情况下,如果需要在组件上绘制图形,只需要重写JComponent的paintComponent(Graphics g)方法,该方法的参数是一个Graphics对象。
  在Graphics中定义了多种绘图方法,分别如下。
  • drawArc(intx,inty,intwidth,intheight,intstartAngle,int arc Angle):沿着由左上角为(x,y)、宽为width、高为height的外接矩形所限定的椭圆绘制一条弧。弧起始于startAngle,延伸的距离由arcAngle定义。
  • drawLine(int x1,int y1,int x2,int y2):绘制一条从点(x1,y1)到点(x2,y2)的直线。
  • drawOval(intx,inty,intwidth,int height):绘制一个由左上角为(x,y)、宽为width、高为height的外接矩形所限定的椭圆。
  • drawPolygon(int[ ] xPoints,int[ ] yPoints,intnPoints):绘制由x和y坐标数组定义的一系列连接线。每对(x,y)坐标定义了一个点。如果第一个点和最后一个点不同,则图形不是闭合的。
  • drawRect(int x,inty,intwidth,int height):绘制一个矩形,其左上角为(x,y),宽为width,高为height。
  • drawRoundRect(intx,inty,intwidth,intheight,int arc Width,int arc Height):用此图形上下文的当前颜色绘制圆角矩形的边框。矩形的左边和右边分别位于x和x+width。矩形的顶边和底边位于y和y+height。
  • drawString(String str,intx,int y):在点(x,y)处输出字符串str,向右扩展。
  • draw3DRect((intx,inty,intwidth,intheight,boolean raised)):绘制指定矩形的3D突出显示边框。
  矩形的左上角为(x,y),宽为width,高为height。raised指示矩形是凸出平面显示还是凹入平面显示。还可以用Graphics类的方法来指定图形是否要填充。不填充的图形只显示图形的轮廓,而且是透明的,即可以看到下面的图形。上述方法绘制的图形都属于这一类。与此相对应的,填充的图形在边界内是实心的,并遮挡了下层的图形。这类方法与对应的图形绘制方法相同,只是用当前的前景色填充图形,分别如下。
  • fillArc(intx,inty,int width,int height,intstartAngle,intarcAngle)。
  • fillOval(intx,inty,intwidth,int height)。
  • fillPolygon(int[ ] xPoints,int[ ] yPoints,intnPoints)。
  • fillRect(intx,inty,intwidth,int height)。
  • fillRoundRect(intx,inty,intwidth,intheight,intarcWidth,intarcHeight)。
  每个图形环境都有一种画图或是画字符串时正使用的前景色。画图所在的每个表面都有背景色。用Graphics类中的setColor方法可以设置前景色,使用所画组件(如面板)的setBackground方法可以设置背景色。
  多边形是有多个边的图形,在Java中,它由对应于多边形各顶点的点序列(x,y)来定义。常用数组来保存坐标序列。使用Graphics类的方法可以绘制多边形,类似于矩形和椭圆的绘制。和其他图形一样。
  多边形也可以画成填充的或不填充的。画多边形的方法分别是drawPolygon( )和fillPolygon( )。这两种方法都是重载的,一种是使用整数数组当作参数来定义多边形形式的方法,已经在上面列出了,另一种是使用Polygon类的对象来定义多边形。当使用数组作参数时,drawPolygon( )和fillPolygon( )方法各带3个参数。第一个参数是表示多边形各点x坐标的整数数组,第二个参数是表示多边形各点y坐标的整数数组,第三个参数是一个整数,表示两个数组中有多少个点可用。放在一起来看,前两个参数表示多边形各点的(x,y)坐标。多边形常是封闭的。线段总是从坐标序列中最后一个点画回序列中的第一个点。
  与多边形类似,折线也包含了连接每个线段的一系列的点。但与多边形不同的是,绘制折线时第一个坐标和最后一个坐标并不自动连接起来。因为折线不封闭,所以也不能填充。它只有一个方法drawPolyline( ),方法中的参数与drawPolygon( )方法中的参数类似。当使用Polygon类作参数时,可以使用Java标准类库java.awt包中定义的Polygon类的对象来显式地定义多边形。drawPolygon( )和fillPolygon( )方法都重载了两个方法,并且都仅带一个Polygon对象参数。
  Polygon对象封装了多边形边的坐标。Polygon类的构造方法可以创建一个初始的空多边形,或是由代表各顶点坐标的整数数组定义的多边形。Polygon类中有方法可以将点添加到多边形中,也有方法可以判定给定的点是不是在多边形上。它还有能得到多边形的外接矩形的方法,以及将多边形中的所有点移到另一个位置的方法。
  Polygon类中的常用方法如下:
  • Polygon( ):构造方法,创建空的多边形。
  • Polygon(int[ ] xpoints,int[ ] ypoints,intnpoints):构造方法,使用xpoints和ypopints中的相对应的坐标对(x,y)来创建多边形。
  • addPoint(intx,int y):将由参数指定的点加入到多边形中。
  • contains(intx,int y):如果指定的点含在多边形中,则返回真。
  • contains(Point p):如果指定的点含在多边形中,则返回真。
  • getBounds( ):得到多边形的外接矩形。
  • translate(intdeltaX,intdeltaY):将多边形的各顶点沿x轴偏移deltaX,沿y轴偏移deltaY。

02 实例演示

实例代码如下

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Subject implements ActionListener {
    JFrame frame;
    MyButton button;
    MyPanel panel;
    int tag=1;
    public static void main(String args[])
    {
    	Subject s=new Subject();
    	s.go();
    }
	@Override
	public void actionPerformed(ActionEvent arg0) {
		// TODO Auto-generated method stub
	   if(tag==0){
		   tag=1;
		   button.setText("Draw");
	   }else{
		   tag=0;
		   button.setText("Clear");
	   }
	   panel.repaint();
	  
		
	}
	public void go()
	{
		frame=new JFrame("Drawing Example");
		button=new MyButton("Draw");
		button.addActionListener(this);
		frame.getContentPane().add(button,"South");
		panel=new MyPanel();
		frame.getContentPane().add(panel,"Center");
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setSize(360,200);
		frame.setVisible(true);
	}
	public class MyPanel extends JPanel {

		   protected void paintComponent(Graphics g)
		   {
			   super.paintComponent(g);
			   int xpoints[]={280,300,320,290,2601};
			   int ypoints[]={120,120,130,150,130};
			   if(tag==0)
			   {
				   g.setColor(Color.BLUE);
				   g.drawLine(40, 25, 30, 50);
				   g.setColor(Color.green);
				   g.drawRect(100, 50, 100, 46);
				   g.setColor(Color.red);
				   g.drawRoundRect(73, 32, 56, 37, 10, 16);
				   g.setColor(Color.yellow);
				   g.fillOval(180, 60, 60, 45);
				   g.setColor(Color.pink);
				   g.fillArc(250, 32, 90, 60, 15, 30);
				   g.setColor(Color.magenta);
				   g.fillPolygon(xpoints,ypoints,5);
				   g.setColor(Color.red);
				   g.fillRect(10, 110, 80, 30);
				   g.setColor(Color.green);
				   g.fillRect(50, 120, 80, 30);
				   g.setXORMode(Color.blue);
				   g.fillOval(90, 130, 80, 30);
			   }
			   
		   }
		}
	public class MyButton extends JButton {
	     MyButton(String text)
	     {
	    	 super(text);
	     }
	     protected void paintComponent( Graphics g)
	     {
	    	 super.paintComponent(g);
	    	 g.setColor(Color.red);
	    	 int width=getWidth();
	    	 int height=getHeight();
	    	 g.drawOval(4, 4, width-8, height-8);
	     }
	}




}

最后实现的效果如下
在这里插入图片描述

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值