图形程序设计

在这里插入图片描述

1.创建框架

代码示例

import java.awt.*;
import javax.swing.*;// javax表示这个包为扩展包

public class SimpleFrameTest{
    public static void main(String[] args) {
        // 所有的Swing组件都必须由事件分派线程(event dispatch thread)进行配置,线程将鼠标点击和按键控制转移到用户接口组件。
        EventQueue.invokeLater(()->{
            SimpleFrame frame=new SimpleFrame();
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// 定义用户关闭框架的响应动作
            frame.setVisible(true);// 显示框架
            //frame.setUndecorated(true);// 关闭所有框架装饰
        });
    }    
}
class SimpleFrame extends JFrame{
    //设置框架大小
    private static final int DEFAULT_HEIGHT=300;
    private static final int DEFAULT_WIDTH=200;
    public SimpleFrame(){
        setSize(DEFAULT_WIDTH,DEFAULT_HEIGHT);
    }
}

2.框架定位

代码示例

import java.awt.*;
import javax.swing.*;

public class SizedFrameTest {
    public static void main(String[] args) {
        EventQueue.invokeLater(()->{
            JFrame frame=new SizedFrame();
            frame.setTitle("SizedFrame");// 设置标题
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setVisible(true);
            frame.setExtendedState(Frame.MAXIMIZED_BOTH);//将框架设置为最大
        });
    }
}
class SizedFrame extends JFrame{
    public SizedFrame(){
        //获取屏幕尺寸
        Toolkit kit=Toolkit.getDefaultToolkit();// Toolkit类包含很多与本地窗口系统打交道的方法
        Dimension screenSize=kit.getScreenSize();// Dimension对象包含公有实例变量width和height
        int screenHeight=screenSize.height;
        int screenWidth=screenSize.width;
        //设置框架尺寸使得
        setSize(screenWidth/2,screenHeight/2);
        setLocationByPlatform(true);//定位框架

        //设置框架图标
        Image img=new ImageIcon("icon.gif").getImage();
        setIconImage(img);
    }
}

java.awt.Components

  • boolean isVisible()
  • void setVisible(boolean b)获取或设置visible属性。组件最初是可见的,但JFrame这样的顶层组件除外
  • void setSize(int width, int height)使用给定的宽度和高度重新设置组件的大小
  • ```void setLocation(int x, int y) ` 将组件移到新的位置上。如果不是顶层组件,x和y的坐标(或者p.x和p.y)是容器坐标;否则是屏幕坐标
  • void setBounds(int x ,int y, int width, int height)移动并重新设置组件的大小
  • Dimension getSize()
  • void setSIze(Dimension d)获取或设置当前组件的size属性

java.awt.Window

  • void toFront()将这个窗口显示在其他窗口前面
  • ```void toBack()` `` 将这个窗口移到桌面窗口栈的后面,并相应地重新排列所有地可见窗口
  • boolean isLocationByPlatform()
  • ```void setLocationByPlatform(boolean b) `

java.awt.Frame

  • boolean isResizable()
  • void setResizable(boolean b)
    获取或设置resizable属性。这个属性设置后,用户可以重新设置框架的大小
  • String getTitle()
  • void setTitle(String s)
    获取或设置title属性,这个属性设置后,用户可以重新设置框架的大小
  • Image getIconImage()
  • void setIconImage(Image image)
    获取或设置iconImage属性,这个属性确定框架的图标。窗口系统可能会将图标作为框架装饰或其他部位的一部分显示
  • boolean isUndecorated()
  • ```void setUndecorated(boolean b) `
    获取或设置undecorated属性。这个属性设置后,框架显示中将没有标题栏或关闭按钮这样的装饰。在框架显示之前,必须调用这个方法
  • int getExtendedState()
  • void setExtendedState(int state)
    获取或设置窗口状态。状态是下列值之一:
    Frame.NORMAL
    Frame.ICONIFIED
    Frame.MAXIMIZED_HORIZ
    Frame.MAXIMIZED_VERT
    Frame.MAXIMIZED_BOTH

java.awt.Toolkit

  • static Toolkit getDefaultToolkit() 返回默认的工具箱
  • Dimesion getScreenSize() 返回用户屏幕的尺寸

javax.swing.ImageIcon

  • ImageIcon(String filename) 构造一个图标,其图像存储在一个文件中。
  • Image getImage() 获得该图标的图像

3.在组件中显示信息

JFrame 内部结构
在这里插入图片描述

代码示例

import javax.swing.*;
import java.awt.*;


public class NotHelloWorld {
    public static void main(String[] args) {
        EventQueue.invokeLater(()->{
            JFrame frame=new NotHelloWorldFrame();
            frame.setTitle("NotHelloWorld");
            frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE);
            frame.setVisible(true);
        });
    }
      
}
//包含消息面板的框架
class NotHelloWorldFrame extends JFrame{
    public NotHelloWorldFrame(){
        add(new NotHelloWorldComponent());
        pack();//在框架中填入一个或多个组件时,如果你只想使用它们的首选大小,可以调用pack方法
    }
}  
//显示消息的组件
class NotHelloWorldComponent extends JComponent{
    public static final int MESSAGE_X=75;
    public static final int MESSAGE_Y=100;
    private static final int DEFAULT_HEIGHT=200;
    private static final int DEFAULT_WIDTH=300;
    //创建一个能够进行绘制的组件
    public void paintComponent(Graphics g){
        g.drawString("Not a Hello, World program",MESSAGE_X,MESSAGE_Y);

    }
    //返回一个有首选宽度和高度的Dimension类对象
    public Dimension getPreferredSize(){
        return new Dimension(DEFAULT_WIDTH,DEFAULT_HEIGHT);
    }
}
/*
JPanel是一个可以包含其他组件的容器(container),但同样可以在其上绘制。
有一点不同之处是,面板不透明,这意味着需要在面板的边界内绘制所有的像素。
最容易实现的方法是,在每个面板子类的paintComponent方法中调用super.paintComponent来用背景色绘制面板:
 * class NotHelloWorldPanel extends JPanel{
 *      public void paintComponent(Graphics g){
 *          super.paintComponent(g);
 *          code for drawing;
 *      }
 * }
 */

javax.swing.JFrame

  • Container getContentPane() 返回这个JFrame的内容窗格对象
  • Component add(Component c) 将一个给定的组件添加到该框架的内容窗格中

java.awt.Component

  • void repaint() “尽可能快地”重新绘制组件
  • Dimension getPreferredSize() 要覆盖这个方法,返回这个组件的首选大小

javax.swing.JComponent

  • void paintComponent(Graphics g) 覆盖这个方法来描述应该如何绘制自己的组件

java.awt.Window

  • void pack() 调整窗口大小,要考虑到其组件的首选大小

4.处理2D图形

代码示例

import java.awt.*;
import java.awt.geom.*;
import javax.swing.*;


public class DrawTest {
    public static void main(String[] args) {
        JFrame frame=new DrawFrame();
        frame.setTitle("DrawTest");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }    
}
//有绘图面板的框架
class DrawFrame extends JFrame{
    public DrawFrame(){
        add(new DrawComponent());
        pack();
    }
}
//显示矩形和椭圆的组件
class DrawComponent extends JComponent{
    private static final int DEFAULT_HEIGHT=400;
    private static final int DEFAULT_WIDTH=400;
    public void paintComponent(Graphics g){
        Graphics2D g2=(Graphics2D)g;
        //矩形
        double leftX=100;
        double topY=100;
        double width=200;
        double height=150;
        Rectangle2D rect=new Rectangle2D.Double(leftX,topY,width,height);
        g2.draw(rect);
        //椭圆
        Ellipse2D ellipse=new Ellipse2D.Double();
        ellipse.setFrame(rect);
        g2.draw(ellipse);

        //对角线
        g2.draw(new Line2D.Double(leftX,topY,leftX+width,topY+height));

        //同心圆
        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);
    }
    public Dimension getPreferredSize(){
        return new Dimension(DEFAULT_WIDTH,DEFAULT_HEIGHT);
    }
}

java.awt.geom.RectangularShape

  • double getCenterX()
  • double getCenterY()
  • double getMinX()
  • double getMinY()
  • double getMaxX()
  • double getMaxY()
    返回闭合矩形的中心,以及最大最小x和y的坐标值
  • double getWidth()
  • double getHeight()
    返回闭合矩形的宽和高
  • double getX()
  • double getY()
    返回闭合矩形左上角的x和y的坐标

java.awt.geom.Rectangle2D.Double

  • Rectangle2D.Double(double x, double y, double w, double h)
    利用给定的左上角、宽和高构造矩形

java.awt.geom.Rectangle2D.Float

  • Rectangle2D.Float(float x, float y, float w, float h)
    利用给定的左上角、宽和高构造矩形

java.awt.geom.Ellipse2D.Double

  • Ellipse2D.Double(double x, double y, double w,double h)
    利用给定的左上角、宽和高的外接矩形,构造一个椭圆

java.awt.geom.Point2D.Double

  • Point2D.Double(double x, double y)
    利用给定坐标构造一个点

java.awt.geom.Line2D.Double

  • Line2D.Double(Point2d start, Point2D end)
  • Line2D.Double(double startX, double startY, double endX, double endY)
    利用给定的起点和终点,构造一条直线

5.使用颜色

代码示例

import java.awt.*;
import java.awt.geom.*;
import javax.swing.*;


public class DrawTest {
    public static void main(String[] args) {
        JFrame frame=new DrawFrame();
        frame.setTitle("DrawTest");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }    
}
//有绘图面板的框架
class DrawFrame extends JFrame{
    public DrawFrame(){
        add(new DrawComponent());
        pack();
    }
}
//显示矩形和椭圆的组件
class DrawComponent extends JComponent{
    private static final int DEFAULT_HEIGHT=400;
    private static final int DEFAULT_WIDTH=400;
    public void paintComponent(Graphics g){
        Graphics2D g2=(Graphics2D)g;
        //矩形
        double leftX=100;
        double topY=100;
        double width=200;
        double height=150;
        Rectangle2D rect=new Rectangle2D.Double(leftX,topY,width,height);
        g2.draw(rect);
        g2.setPaint(Color.RED);// 设置当前颜色
        g2.fill(rect);//给矩形填充颜色
        //椭圆
        Ellipse2D ellipse=new Ellipse2D.Double();
        ellipse.setFrame(rect);
        g2.draw(ellipse);

        //定制颜色
        g2.setPaint(new Color(128,128,128));
        g2.drawString("Welcome!",75,125);

        //对角线
        g2.draw(new Line2D.Double(leftX,topY,leftX+width,topY+height));

        //同心圆
        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);
    }
    public Dimension getPreferredSize(){
        return new Dimension(DEFAULT_WIDTH,DEFAULT_HEIGHT);
    }
}

java.awt.Color

  • Color(int r, int g, int b)
    创建一个颜色对象

java.awt.Graphics

  • Color getColor()
  • void setColor(Color c)
    获取或改变当前颜色。所有后续的绘图操作都会使用这个新颜色

java.awt.Graphics2D

  • Paint getPaint()
  • void setPaint(Paint p)
    获取或设置这个图形环境的绘制属性。Color类实现了Paint接口。因此,可以使用这个方法将绘制属性设置为纯色
  • void fill(Shape s)
    用当前的颜料填充该图形

java.awt.Component

  • Color getBackgrourd()
  • void setBackground()
    获取或设置背景色
  • Color getForeground()
  • void setForeground()
    获取或设置前景色

6.设置字体

打印系统上所有字体名

import java.awt.*;

public class ListFonts {
    public static void main(String[] args) {
        String[] fontNames=GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames();
        for(String fontName:fontNames){
            System.out.println(fontName);
        }
    }
}

代码示例

import java.awt.*;
import java.awt.font.*;
import javax.swing.*;
import java.awt.geom.*;


public class FontTest {
    public static void main(String[] args) {
        EventQueue.invokeLater(()->{
            JFrame frame=new FontFrame();
            frame.setTitle("FontTest");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setVisible(true);
        });
    }
}
//有文本信息组件的框架
class FontFrame extends JFrame{
    public FontFrame(){
        add(new FontComponent());
        pack();
    }
}
class FontComponent extends JComponent{
    private static final int DEFAULT_WIDTH=300;
    private static final int DEFAULT_HEIGHT=200;
    public void paintComponent(Graphics g){
        Graphics2D g2=(Graphics2D)g;
        String message="Hello, World!";
        Font f=new Font("Serif",Font.BOLD,36);
        g2.setFont(f);
        //测量文本的大小
        FontRenderContext context=g2.getFontRenderContext();
        Rectangle2D bounds=f.getStringBounds(message,context);
        //设置文本的坐标
        double x=(getWidth()-bounds.getWidth())/2;
        double y=(getHeight()-bounds.getHeight())/2;
    
        double ascent=-bounds.getY();
        double baseY=y+ascent;
        //绘制文本信息
        g2.drawString(message, (int)x, (int)baseY);
        g2.setPaint(Color.LIGHT_GRAY);
        //绘制基线
        g2.draw(new Line2D.Double(x,baseY,x+bounds.getWidth(),baseY));

        //绘制封闭矩形
        Rectangle2D rect=new Rectangle2D.Double(x,y,bounds.getWidth(),bounds.getHeight());
        g2.draw(rect);
    }
    public Dimension getPreferredSize(){
        return new Dimension(DEFAULT_WIDTH,DEFAULT_HEIGHT);
    }
}

java.awt.Font

  • Font (String name, int style, int size)
    创建一个新字体对象。
  • String getFontName()
    返回字体名, 例如,“ Helvetica Bold ”。
  • String getFamily()
    返回字体家族名, 例如,“ Helvetica ”。
  • String getName()
    如果采用逻辑字体名创建字体,将返回逻辑字体, 例如,“ SansSerif”;否则,返回字
    体名。
  • Rectangle2D getStringBounds(String s, FontRenderContext context)
    返回包围这个字符串的矩形。 矩形的起点为基线。 矩形顶端的 y 坐标等于上坡度的负
    值。 矩形的高度等于上坡度、 下坡度和行间距之和。 宽度等于字符串的宽度
  • LineMatrics getLineMetrics(String s, FontRenderContext context)
    返回测定字符串宽度的一个线性 metrics 对象。
  • Font deriveFont(int style)
  • Font deriveFont(float size)
  • Font deriveFont(int style, float size)
    返回一个新字体, 除给定大小和字体风格外, 其余与原字体一样。

java.awt.font.LineMetrics

  • float getAscent()
    返回字体的上坡度——从基线到大写字母顶端的距离。
  • float getDescent()
    返回字体的下坡度——从基线到坡底的距离。
  • float getLeading()
    返回字体的行间距——从一行文本底端到下一行文本顶端之间的空隙。
  • float getHeight()
    返回字体的总高度——两条文本基线之间的距离 ( 下坡度 + 行间距 + 上坡度 )。

java.awt.Graphics

  • Font getFont()
  • void setFont(Font font)
    获取或设置当前的字体。 这种字体将被应用于后续的文本绘制操作中。
  • void drawString(String str,int x, int y)
    采用当前字体和颜色绘制一个字符串。

java.awt.Graphics2D

  • FontRenderContext getFontRenderContext()
    返回这个图形文本中, 指定字体特征的字体绘制环境。
  • void drawString(String str, float x, float y)
    采用当前的字体和颜色绘制一个字符串。

7.显示图像

代码示例

import java.awt.*;
import javax.swing.*;



public class ImageTest {
    public static void main(String[] args) {
        EventQueue.invokeLater(()->{
            JFrame frame=new ImageFrame();
            frame.setTitle("ImageTest");
            frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE);
            frame.setVisible(true);
        });
    }    
}
class ImageFrame extends JFrame{
    public ImageFrame(){
        add(new ImageComponent());
        pack();
    }
}
//显示平铺图像的组件
class ImageComponent extends JComponent{
    private static final int DEFAULT_WIDTH=300;
    private static final int DEFAULT_HEIGHT=200;
    private Image image;
    public ImageComponent(){
        image=new ImageIcon("haha.gif").getImage();
    }
    public void paintComponent(Graphics g){
        if(image==null)
            return;
        int imageWidth=image.getWidth(this);
        int imageHeight=image.getHeight(this);

        //在左上角绘制图像
        g.drawImage(image, 0, 0, null);
        //在组件上平铺图像
        for(int i=0;i*imageWidth<=getWidth();i++){
            for(int j=0;j*imageHeight<=getHeight();j++){
                if(i+j>0){
                    g.copyArea(0, 0, imageWidth, imageHeight, i*imageWidth, j*imageHeight);
                }
            }
        }
    }
    public Dimension getPreferredSize(){
        return new Dimension(DEFAULT_WIDTH,DEFAULT_HEIGHT);
    }
}

java.awt.Graphics

  • boolean drawImage(Image img, int x, int y, ImageObserver observer)
    绘制一幅非比例图像。 注意: 这个调用可能会在图像还没有绘制完毕就返回。
  • boolean drawImage(Image img, int x, int y, int width, int height, ImageObserver observer)
    绘制一幅比例图像。 系统按照比例将图像放人给定宽和高的区域。 注意: 这个调用可
    能会在图像还没有绘制完毕就返回。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

能饮一杯吴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值