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