yuchen的专栏

如何绘制图形

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类的引用来绘制图形
}
}

知识点

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) ;