570 likes | 809 Views
第四章 图形编程. DrawingShap.java. 4.1AWT 与 Swing 简介. 一 .AWT 工具包 java 的抽象窗口工具包( AWT:Abstract window Interface) 包含在 java.awt 包中,它提供了许多用来设计 GUI 的 组件类和容器类. 基本 AWT 库处理用户界面元素的方法是把这些元素的创建和行为委托给每个目标平台上的本地 GUI 工具箱进行处理. AWT 的层次关系. Event. Font. Component. Graphics. MenuCompon. Button. ScrollBar.
E N D
第四章 图形编程 DrawingShap.java
4.1AWT与Swing简介 • 一.AWT工具包 • java的抽象窗口工具包(AWT:Abstract window Interface)包含在java.awt包中,它提供了许多用来设计GUI的组件类和容器类 • 基本AWT库处理用户界面元素的方法是把这些元素的创建和行为委托给每个目标平台上的本地GUI工具箱进行处理
AWT的层次关系 Event Font Component Graphics MenuCompon Button ScrollBar Container List Canvas Window Panel TextField CheckBox Frame Dialog Applet Label TextArea
二. Java Swing • Swing:非基于对等体的GUI工具箱 • Swing具有更丰富并且更方便的用户界面元素集合 • Swing对底层平台的依赖更少 • Swing会带来交叉平台上的统一视觉体验 • Swing类被放在javax.Swing包上
Swing 组件层次关系 Componemt Container JComponent Window Frame Dialog JPanel Jtext.. JLabel JScroller JMenuBar JButton JFrame JDialog
三.AWT与Swing的关系 • 对于使用过Java早期版本的人来说,大部分AWT组件都有其Swing等价物 • 后者的名字一般是在前面添加一个字母“J”,如:JButton,JFrame,JPanel等
4.2组件和容器 • 一.组件 • Java把由Component类的子类或间接子类创建的对象称为一个组件 • 例:Button button1=new Button(); • 例:TextField textfield=new • TextField(); • 例:Label label=new Label();
二.容器 • Java把由container类的子类或间接子类创建的对象称为一个容器 • 例: • Frame fra=new Frame(“这是一个窗口”); • Applet是Panel的子类,是Container的间接子类 • Applet本身也是一个容器
三.添加组件 • Component类提供了一个方法:add(); • 例:fra.add(button); • 例:fra.add(TextField);
容器本身也可以看作是一个组件,因此可以把一个容器添加到另一个容器里,实现容器嵌套容器本身也可以看作是一个组件,因此可以把一个容器添加到另一个容器里,实现容器嵌套 • 例:add(fra);
四。布局管理器 • Java 采用非常优秀的概念来进行布局 • 一个容器内的所有组件都由一个布局管理器来进行管理 • Java支持以下四种布局管理器 • FlowLayout • BorderLayout • CardLayout • GridBagLayout
五.常用容器 1.框架 • 在Java中,顶层窗口(没有包含在另一个窗口内的窗口)称为框架 AWT库中有一个基于对等体的Frame类对应着顶层 该类的Swing版本为JFrame,JFrame是Frame 子类 例:框架是容器的例子 SimpleFrameTest.java
import javax.swing.*; • public class SimpleFrameTest • { public static void main(String[] args) { • SimpleFrame myframe = new • SimpleFrame(); • myframe.setDefaultCloseOperation( • JFrame.EXIT_ON_CLOSE); • myframe.show(); • } • }
class SimpleFrame extends JFrame • { • public SimpleFrame() • { • setSize(WIDTH, HEIGHT); • } • public static final int WIDTH = 300; • public static final int HEIGHT = 200; • }
2.定义相对框架 通过调用toolkit来得到系统相关信息 例:获得屏幕尺寸 Toolkit kit = Toolkit.getDefaultToolkit(); Dimension screenSize = kit.getScreenSize(); int screenHeight=screenSize.height; int screenWidth = screenSize.width; 例:CenteredFrameTest.java
class CenteredFrame extends JFrame { public CenteredFrame() { // get screen dimensions Toolkit kit = Toolkit.getDefaultToolkit(); Dimension screenSize = kit.getScreenSize(); int screenHeight = screenSize.height; int screenWidth = screenSize.width; // center frame in screen setSize(screenWidth / 2, screenHeight / 2); setLocation(screenWidth / 4, screenHeight / 4) // set frame icon and title Image img = kit.getImage("icon.gif"); setIconImage(img); setTitle("CenteredFrame"); } }
3.常见类及方法API • java.awt.Component • boolean isVisible()检查组件是否可见 • void setVisible(boolean b) • 设置组件可见 • void setBounds(int x,int y,int • width,int height)移动并缩放组件 • Dimension getSize()得到组件的大小 • void setSize(int width,int height) • void setSize(Dimension d) • 把组件缩放到指定调度和宽度
java.awt.window • void toFrond()放在其它窗口前面 • void toBack()放在其它窗口后面 • java.awt.Frame • void setResizable(boolean b)缩放框架 • void setTitle(String s)设置标题 • void setIconImage(Image image) • 将Image用作图标
java.awt.Toolkit • Dimension getScreenSize() • 得到用户屏幕大小
六.显示信息 • 前面的例子中 ,信息都显示在控制台窗口,现在我们试着把信息显示到JFrame中 JFrame的结构有点复杂,它包括:根窗格、布局窗格、透明窗格和内容窗格 • 内容窗格是用来添加组件的,获得内容窗格的代码如下: • 在AWT中可调用add()把组件直接添加到AWT Frame中 ,但在Swing中组件只能添加到内容窗格里
Container cp=getContentPane(); Component c=…; cp.add(c); • 用户也可以创建一个画板,然后在画板上进行绘制,最后将画板添加到内容窗格里,此时需要重写paintComponent() • paintComponent(Graphics g)是定义在JComponent中,每当该方法被调用时,系统就自动产生一个Graphics类型的参数,传递给paintComponent方法中的参数g
class MyPanel extends JPanel • { • public void paintComponent(Graphics g) • { • super.paintComponent(Graphics g) • g.drawString(“Hello!world”) • ….} } MyPanel扩展了JPanel,但面板的背景颜色等工作要由Jpanel来完成,super.paintComponent确保父类也参预绘制 • Graphics类提供绘制图像和输出文本的方法 • 创建一个画板
例.在画板上输出信息NotHelloWorld.java class NotHelloWorldFrame extends JFrame { public NotHelloWorldFrame() { setTitle("NotHelloWorld"); setSize(WIDTH, HEIGHT); // add panel to frame NotHelloWorldPanel panel = new NotHelloWorldPanel(); Container contentPane = getContentPane(); contentPane.add(panel); } • 只要窗口重新绘制,paintComponent()就被自动调用(在AWT中是paint())
class NotHelloWorldPanel extends JPanel { public void paintComponent(Graphics g) { super.paintComponent(g); g.drawString("Not a Hello, World program", MESSAGE_X, MESSAGE_Y); } public static final int MESSAGE_X = 75; publicstatic final int MESSAGE_Y = 100; }
常用API • javax.swing.JFrame • Container getContentPane() • 返回JFrame的内容窗格 • java.awt.Component • void repain() 重新绘制组件 • void repaint(int x, • int y,intwidth,int height) • 重新绘制组件的一部分
javax.swing.Jcomponent • void paintComponent(Graphics g) • 需要重写该方法来说明你的组件应如何绘制
5.3图形编程 • 一. 2D图形 • 1.2D对象 • 随着SDK2.0版的到来,J2SE包含了一个Java 2D库,该库实现了一个非常强大的图形操作集 • 如何获得Graphics 2D类对象 • 该类是Graphics类的子类,通常可用Graphics对象转换而来.例:
public void paintComponent(Graphics g) • { graphics2D g2=(graphics 2D)g; • ….. • } • 2.坐标 • JDK 1.0版中使用整数像素坐标系 • java 2D形体使用浮点数坐标系,这样可为坐标指定单位。 • 存在的问题:Retangle2D r=……….; • float f=r.getWidth();/*Error*/
因此,2D库的形体类有两种版本: • Retangle2D.Float • Retangle2D.Double • getWidth()返回double值,应进行转换: • float f=(float)r.getWidth(); 例:DrwaTest.java
class DrawPanel extends JPanel { public void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2 = (Graphics2D)g; // draw a rectangle double leftX = 100; double topY = 100; double width = 200; double height = 150; Rectangle2D rect = new Rectangle2D.Double(leftX, topY, width, height); g2.draw(rect);
// draw the enclosed ellipse Ellipse2D ellipse = new Ellipse2D.Double(); ellipse.setFrame(rect); g2.draw(ellipse); // draw a diagonal line g2.draw(new Line2D.Double(leftX, topY, leftX + width, topY + height));
// draw a circle with the same center double centerX = rect.getCenterX(); double centerY = rect.getCenterY(); double radius = 150; Ellipse2D circle = new Ellipse2D.Double(); circle.setFrameFromCenter(centerX, centerY, centerX + radius, centerY + radius); g2.draw(circle); } }
3.常用API • java.awt.geom.Retangle2D.Double • Retangle2D.Double(double x,double y, • double width,double height) java.awt.geom.Retangle2D.Float • Retangle2D.Float(float x,float y,float • width, float height) • java.awt.geom.Ellipse2D.Double • Ellipse2D.Double(double x,double y, • double width,double height)
java.awt.geom.Line2D.Double • Line2D.double(Point2D start,Point2D end) • Line2D.double(double startx,double starty, • double endx,double endy) • java.awt.geom.Point2D.Double • Point2D.Double(double x,double y) • fill(Graphics2D rec) 填充颜色 • drawGraphics2D rec) 绘制图形rec
二.颜色 • Graphics2D类的setPaint方法(Graphics类为setColor方法)用来设置颜色。例: • g2.setPaint(Color.red); • g2.drawString(“Set Color”,100,100) • 1.标准颜色 • black、blue、cyan、darkgray、gray、green、lightgray、magenta、orange、pink、red、white、yellow
2.复合色 • 通过指定红绿蓝三色比例,用Color对象来复合成一种新的颜色。Color构造器如下: • Color(int redness,int greenness,int blueness) • 其中参数取值为0--255 • 例:g.setPaint(new Color(0,128,128)); • 3.常用API • java.awt.Color • void Color(int r,int g,int b)
java.awt.Graphics • void setcolor(Color c) • java.awt.Graphic2D • void setPaint(paint p) • java.awt.Cmponent • void setBackground(Color c) • void setForeground(Color c) • 例:填充颜色的例子FillTest.java
class FillPanel extends JPanel { public void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2 = (Graphics2D)g; // draw a rectangle double leftX = 100; double topY = 100; double width = 200; double height = 150;
Rectangle2D rect = new Rectangle2D.Double (leftX, topY,width, height); g2.setPaint(Color.red); g2.fill(rect); // draw the enclosed ellipse Ellipse2D ellipse = new Ellipse2D.Double(); ellipse.setFrame(rect); g2.setPaint(new Color(0, 128, 128)); // a dull blue-green g2.fill(ellipse); } }
三.文本和字体 • 例:将字符串显示在画板中央的例子 • FontTest.java
1.五个逻辑字体名 • SanaSerif • Serif • Monospaced • Dialog • DialogInput
2.字体风格 • Font.PLAIN • Font.BOLD • Fond.ITALIC Fond.BOLD+Font.ITALIC • 3.设置字体 • Font serif=new • Font(“Serif”,Font.BOLD,14); • g2.setFont(serif);
4.编程控制字体 • 字符输出的效果取决于下面三个因素: • 使用的字体 • 字符串 • 绘制字体的设备 • 几个基本术语: 上坡度 基线 高度 下坡度 基线 空行
调用Graphics2D类中的getFontRenderContext • 方法,可获得一个FontRenderContext类的对象,把这个对象传给Fond类的getStringBounds方法,该方法返回一个包围字符串的矩形.代码如下: • String message=“Hello,World!”; • Font f=new Foun(“serif”,Font.BOLD,14); • FontRenderContext context= • g2. getFontRenderContext(); • Retangle2D bounds= • f. getStringBounds(message,context);
获得字符串宽度、高度、上坡度、下坡度的方法如下:获得字符串宽度、高度、上坡度、下坡度的方法如下: • double stringwidth= • bounds.getWidth(); • double stringheigth= • bounds.getHeigth(); • double ascent= - bounds.getY(); • double descent= bounds.getHeigth() • +bounds.getY(); 基点
将字符串显示在面板中央的代码如下: • String message=“Hello,World!”; • Font f=new Foun(“serif”,Font.BOLD,14); • FontRenderContext context= • g2. getFontRenderContext(); • Retangle2D bounds= • f. getStringBounds(message,context); • double x=(getWidth()- • bounds. getWidth())/2;
double y=(getHeigth()- • bounds.getWidth())/2; • double ascent= - bounds.getY(); • double basey=y+ascent; • g2.drawString(message, • (int)x,(int)basey); • 例:将字符串显示在画板中央的例子 • FontTest.java
API: • java.awt.Font • Font(String name,int style,int Size) • String getFontName() • String getFamily() • String getName() • Retangle2D getStringBounds(String s, • FountRenderContext context)
java.awt.font.LineMetrics • float getAscent() • float getDecent() • float getHeight() • float getWeight() • java.awt.Graphics • void setFont(Font font) • void DrawString(String str,int x,int y)