JAVA编程基础:第八章 图形编程

如何绘制图形

1 需要编写扩展 JPanel 类的新类。
2 .在 Jpanel 类或子类中覆盖父类的 paintComponent() 方法
import java.awt      // 使用 awt   此包支持绘制图形的方法
import javax.swing   // 使用 swing 此包中有 Jframe Jpanel 等组件
class jp extends Jpanel
{
   public void paintComponent(Graphics g)
{
通过使用Graphics类的引用来绘制图形
}
}
 
知识点
1. Graphics对象
paintComponent方法包含一个Graphics类型的参数。
Graphics对象记录针对绘制图形和文本的一系列设置, 比如设置的图标或当前颜色、字体等。
Java中,所有绘制都必须通过一个图形对象。
PaintComponent方法:位于Jcomponent类中,此类是所有非窗口Swing类中的组件的父类
2. Java2D API
刚才的绘图方法属于基本的绘图方法,不能绘制复杂的图形,例如:不能使用实数坐标,不能绘制虚线或宽度不一的线条,不能使用纹理填充图形等等
Java2D API是为了解决这些问题产生的
基本的绘图方法
public void paint(Graphics g) {
  g.setColor(someColor); // 设置颜色
  g.setFont(someLimitedFont); // 设置字体
  g.drawString(...);// 绘制字符串
  g.drawLine(...); // 画线
  g.drawRect(...);    // 绘制图形轮廓
  g.fillRect(...);   // 绘制填充图形
  g.drawPolygon(...); // 绘制图形轮廓
  g.fillPolygon(...); // 绘制图形轮廓
 ...
}
Java2D的绘图方法
public void paintComponent(Graphics g) {
 super.paintComponent(g);//如果不透明则清楚背景
 Graphics2D g2d = (Graphics2D)g;// 强制转换为 Graphics2D 必须转换
 g2d.setPaint(fillColorOrPattern);
 g2d.setStroke(penThicknessOrPattern);
  g2d.setComposite(someAlphaComposite);
 g2d.setFont(anyFont);
  g2d.setColor(anyColor);
  g2d.translate(...);
 g2d.rotate(...);
 g2d.scale(...);
 g2d.shear(...);
 g2d.setTransform(someAffineTransform);
 SomeShape s = new SomeShape(...);
 g2d.draw(s); // 绘制图形轮廓
 g2d.fill(s); // 绘制填充图形
}
3. Font 类
可以设置生动的字体样式,我们可以通过使用setfont方法设置 Graphics对象的字样
Font 类只有一个构造函数:
    public Font(String name, int style, int pointsize)
参数name表示字体的名称。
参数style表示样式可以是 Font.PLAIN  Font.BOLD Font.ITALIC
参数pointsize表示字体的点数,即以磅为单位的字体大小,可以是 11、12、14、16 等
public void paint(Graphics g){
 . . .
 g.setFont(new Font("Helvetica",Font.ITALIC,18));
 g.drawString("Draw where ever you want",100,10);
 . . .
}
4.FontMetrics 类
通过使用 getFontMetrics( ) 方法,而不是new运算符(因为它是一个抽象类),可以创建该类的对象。
这个对象包含与字体相关的大量信息,包括字符的高度、按像素数计算的字符串宽度等。
这样,我们可以将字符串显示在特定的位置中
常用方法如下:
    int stringWidth(String s): 返回 字符串宽度
    int charWidth(char c): 返回字符c的宽度
    int getHeight(): 返回字体的高度
/*
   将字符串显示在面板的中央位置
*/
import java.awt.*;
import javax.swing.*;
class FontsPanel extends JPanel {  
   public void paintComponent(Graphics g) {
     String quote=" Happiness is an attitude.";
     Font f=new Font("Georgia",Font.ITALIC,16);
     g.setFont(f);
     g.drawString(quote,20,20);
   }
}
 
public class FontsDemo extends JFrame{
 public FontsDemo() {
     setTitle("test"); setSize(300,200);
     Container contentPane=getContentPane();
     contentPane.add(new FontsPanel());
 }
 public static void main(String args[]) {
     FontsDemo frame=new FontsDemo(); 
     frame.show();
 }
}
 
 
import java.awt.*;
import javax.swing.*;
class Fonts2Panel extends JPanel {  
 public void paintComponent(Graphics g) {
   String myquote="Happiness is an attitude.";
   Font f=new Font("Times New
              Roman",Font.BOLD+Font.ITALIC,24);
   g.setFont(f);
    FontMetrics fm=getFontMetrics(f);
   int x=(getSize().width - fm.stringWidth(myquote))/2;
   int y=getSize().height/2;
   g.drawString(myquote,x,y);
 }
}
列出当前平台上所有可用字体
当使用字体的时候,我们需要知道有哪些可以用的字体,我们通过GraphicsEnvironment类的getLocalGraphicsEnvironment()方法可以得到所有字体
import java.awt.*;
public class ListFonts {
 public static void main(String[] args) {
   GraphicsEnvironment env =
    GraphicsEnvironment.getLocalGraphicsEnvironment();
   String[] fontNames =
      env.getAvailableFontFamilyNames();
   System.out.println(" 可用字体: ");
   for(int i=0; i<fontNames.length; i++)
      System.out.println(" " + fontNames[i]);
 }
}
5. Color类
可以设置颜色
设置颜色方法
如果要修改或设置组件的颜色,可以使用下列几种方法:
  void setColor(Color newColor) :设置当前绘制的颜色
 void setForeground(Color) 设置前景色
 void setBackground(Color) 设置背景色
 
使用颜色示例
import java.awt.*;
import javax.swing.*;
class ColorsPanel extends JPanel {  
   public void paintComponent(Graphics g) {
     Font f=new Font("Georgia",Font.ITALIC,16);
     g.setFont(f);
     g.setColor(Color.red);
     g.drawString("Hello",75,100);
     g.setColor(new Color(0,128,128));
     g.drawString("World",75,125);
   }
}
6.绘制图形
使用 AWT 时,通常通过调用 Graphics 对象的 drawXxx 或 fillXxx 方法来绘制图形。
通过drawXxx方法绘制图形边框,通过fillXxx 方法绘制填充图形。
这些对象用当前选择的颜色来绘制和填充,黑色是默认的颜色。
在 Java 2D 中,通常先创建 Shape 对象,然后调用 Graphics2D 对象的 draw 或 fill 方法。
Java 2D 库以面向对象的方式组合几何形体。
java.awt.geom包中囊括了一些有用的Shape实现。如:
Line2D
Rectangle2D
Ellipse2D
 
使用线条绘制图形
java.awt.Graphics中提供了一些方法用来绘制图形对象中的直线和多边形。方法如下:
    void drawLine(int startX,int startY,int entX,int endY): 绘制一条直线
    void drawPolygon(int x[],int y[],int numpoints) :绘制多边形轮廓
    void fillPolygon(int x[],int y[],int numpoints) :绘制填充多边形
  void drawPolyline (int x[],int y[],int numpoints) :绘制顺序连线,如果第一个点和最后一个点不同,该图形不封闭
 
 
绘制矩形和椭圆
void drawRect(int top, int left, int width, int height):绘制矩形边框
void fillRect(int top, int left,int width, int height) :绘制填充矩形
void drawOval(int top, int left, int width, int height):绘制椭圆边框
void fillOval(int top, int left,int width, int height) :绘制填充椭圆
 
class ShapesPanel extends JPanel{
 public void paintComponent(Graphics g) {
   super.paintComponent(g);
   g.drawLine(0,0,100,100);// 画线
   g.drawRect(10,10,60,30); // 绘制矩形   
   g.drawRoundRect(90,80,80,80,20,20);// 绘制圆角矩形
   int xpoints[]={20,50,60,30,10}; 
   int ypoints[]={50,50,70,90,70};
   g.drawPolygon(xpoints,ypoints,5);// 绘制多边形
   g.setColor(Color.red);// 设置颜色
   g.fillRect(90,10,80,30);// 绘制填充矩形
   g.fillRoundRect(180,50,100,80,15,15);// 绘制填充圆角矩形
   g.fillOval(10,100,80,30); // 绘制填充椭圆
 }
}
 
绘图模式
XOR 模式的优点是,无论用什么颜色绘制对象,始终能够保证新对象是可见的。
语法如下所示:
        void setXORMode(Color xorColor)
 其中,xorColor 指定了绘制对象时与窗口进行异或操作的颜色。
要返回至覆盖模式,请调用 setPaintMode():
          void setPaintMode()
 
设置绘图模式示例
import java.awt.*;
import javax.swing.*;
class XORPanel extends JPanel {
 public void paintComponent(Graphics g){
 super.paintComponent(g);
 g.setColor(Color.red);
 g.fillRect(10,10,80,30);
 g.setColor(Color.green);
 g.fillRect(50,20,80,30);
 g.setXORMode(Color.blue);// 设置为 XOR 绘图模式
 g.fillOval(90,30,80,30);
 }
}
 
Toolkit 对象
要获得 Toolkit 对象 可以使用 Toolkit 类的静态 getDefaultToolkit 方法。
   Toolkit getDefaultToolkit() 返回缺省工具包。
   Image getImage(String filename) :返回一个将从文件中读取其像素数据的图像。参数filename 包含图像文件(例如,GIF 或 JPEG 文件)
   boolean drawImage(Image img, int x, int y, ImageObserver ob) : 绘制比例图像。
 
以下提供了从当前目录获取本地图像文件的代码(如果图像文件不在当前目录中,必须提供完整的路径名):
         String name="xyz.gif";
        Image img=Toolkit.getDefaultToolkit().getImage(name);
要从网络中获得图像文件,必须提供 URL,例如:
   URL u=new URL( http://www.xyz.com/image.gif);
        Image img= Toolkit.getDefaultToolkit().getImage(u) ;
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值