swing202文本绘制

本文详细介绍了在Java Swing中进行文本绘制的方法,包括文本坐标系统、字体设置、文本定位的两种方式,并提供了一个绘制日历的实例。

文本绘制示例

在这里插入图片描述

package my;

import javax.swing.*;

public class Swing2 {
    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                createGUI();
            }
        });
    }

    private static void createGUI() {
//        System.out.println( System.getProperty("java.class.path"));
        JFrame frame = new MyFrame("Swing Demo");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(500, 300);
        frame.setVisible(true);

    }
}

package my;

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

public class MyFrame extends JFrame {
    public MyFrame(String title) {
        super(title);

        JPanel root = new MyPanel();
        this.setContentPane(root);
        root.setLayout(new BorderLayout());
    }
}

package my;

import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Line2D;
import java.awt.geom.Point2D;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;

public class MyPanel extends JPanel {
    public MyPanel()
    {
    }

    @Override
    protected void paintComponent(Graphics g)
    {
        int width = getWidth();
        int height = getHeight();
        Graphics2D g2d = (Graphics2D) g;

        // 平滑绘制(反锯齿)
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

        g2d.setPaint(Color.BLUE);
        g2d.setFont(new Font("宋体", Font.PLAIN, 30));
        g2d.drawString("good boy !", 100, 100);
    }
}

文字的坐标

在这里插入图片描述

设置字体

package Swing2_02;

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.LinearGradientPaint;
import java.awt.MultipleGradientPaint.CycleMethod;
import java.awt.Paint;
import java.awt.Rectangle;
import java.awt.RenderingHints;
import java.awt.Shape;
import java.awt.Stroke;
import java.awt.font.TextAttribute;
import java.awt.geom.Line2D;
import java.awt.geom.Point2D;
import java.util.HashMap;
import java.util.Map;

import javax.imageio.ImageIO;
import javax.swing.JPanel;

public class MyPanel_swing_02 extends JPanel {

    public MyPanel_swing_02() {
    }

    @Override
    protected void paintComponent(Graphics g) {
        int width = getWidth();
        int height = getHeight();
        Graphics2D g2d = (Graphics2D) g;

        // 平滑绘制 ( 反锯齿 )
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

        g2d.setPaint(Color.BLUE);

        // 基本用法:创建字体
        Font font = new Font("宋体", Font.BOLD | Font.ITALIC, 60);
        g2d.setFont(font);

        // 基本用法:基于原有字体创建一个新的字体
//		Font newFont = g2d.getFont().deriveFont(60f);
//		g2d.setFont(newFont); // 字体高度

        // 高级用法:详细设置各个属性的值  (一般用不到)
//		Map<TextAttribute, Object> fontAttr = new HashMap<>();
//		fontAttr.put(TextAttribute.FAMILY, "宋体"); // 字体名称
//		fontAttr.put(TextAttribute.SIZE, 42);// 字体大小
//		fontAttr.put(TextAttribute.POSTURE, TextAttribute.POSTURE_OBLIQUE);// 斜体
//		fontAttr.put(TextAttribute.WEIGHT, TextAttribute.WEIGHT_BOLD);// 粗体
//		fontAttr.put(TextAttribute.UNDERLINE, TextAttribute.UNDERLINE_ON);// 下滑线
//		Font font = new Font(fontAttr);
//		g2d.setFont(font);

        g2d.drawString("中国万岁", 100, 100); // y 指的是baseline的位置

    }
}

文本的定位1

在这里插入图片描述

package Swing2_02;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.LinearGradientPaint;
import java.awt.MultipleGradientPaint.CycleMethod;
import java.awt.Paint;
import java.awt.Rectangle;
import java.awt.RenderingHints;
import java.awt.Shape;
import java.awt.Stroke;
import java.awt.geom.Line2D;
import java.awt.geom.Point2D;

import javax.imageio.ImageIO;
import javax.swing.JPanel;


public class MyPanel_swing_02 extends JPanel
{

    public MyPanel_swing_02()
    {
    }

    @Override
    protected void paintComponent(Graphics g)
    {
        int width = getWidth();
        int height = getHeight();
        Graphics2D g2d = (Graphics2D) g;

        // 平滑绘制 ( 反锯齿 )
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

        String str = "good boy!";
        g2d.setPaint(Color.BLUE);
        g2d.setFont(new Font("宋体", Font.PLAIN, 30)); // 字体高度
        g2d.drawString(str, 100,100); // y 指的是baseline的位置

        // 参考线
        g2d.setPaint( Color.RED);
        g2d.drawLine(0, 100, width, 100);
        g2d.drawLine(100, 0, 100, height);

        // 文本的测量
        FontMetrics fm = g.getFontMetrics(g2d.getFont()); // 创建一个FontMetrics对象
        int textWidth = fm.stringWidth(str);
        int fontSize = fm.getHeight(); // 字高 = leading + ascent + descent
        int leading = fm.getLeading();
        int ascent = fm.getAscent();
        int descent = fm.getDescent(); // bottom->baseline 的高度
        System.out.printf("文本宽度: %d, 字体高度: %d :(%d,%d,%d) \n",
                textWidth, fontSize, leading, ascent, descent);
    }

}

文本的定位2

在这里插入图片描述

package Swing2_02;

import xyz.swing0202.MyFrame;

import javax.swing.*;

public class demo {
    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                createGUI();
            }
        });
    }

    private static void createGUI() {
        JFrame frame = new MyFrame_swing02_02("demo");
        frame.setDefaultCloseOperation(MyFrame.EXIT_ON_CLOSE);
        frame.setSize(800, 600);
        frame.setVisible(true);

    }
}

绘制日历

在这里插入图片描述

package Swing2_02;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.LinearGradientPaint;
import java.awt.MultipleGradientPaint.CycleMethod;
import java.awt.Paint;
import java.awt.Rectangle;
import java.awt.RenderingHints;
import java.awt.Shape;
import java.awt.Stroke;
import java.awt.geom.Line2D;
import java.awt.geom.Point2D;
import java.util.Calendar;

import javax.imageio.ImageIO;
import javax.swing.JPanel;


public class MyPanel_swing_02 extends JPanel
{

    public MyPanel_swing_02()
    {
    }

    @Override
    protected void paintComponent(Graphics g)
    {
        int width = getWidth();
        int height = getHeight();
        Graphics2D g2d = (Graphics2D) g;

        // 平滑绘制 ( 反锯齿 )
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g2d.setPaint(Color.WHITE);
        g2d.fillRect(0, 0, width, height);

        int x = 0,y = 0;
        int x_size = 40; // 单元格宽度
        int y_size = 40; // 单元格高度

        // 第一行:一、二、三、四、五、六、日
        g2d.setPaint( Color.GRAY);
        g2d.drawLine(x,y, x + x_size*7, y );
        g2d.drawLine(x,y+y_size, x + x_size*7, y + y_size);
        String[] cc = {"一", "二", "三", "四", "五", "六", "日" };

        g2d.setPaint( Color.GRAY);
        g2d.setFont(new Font("宋体", 0,20));
        for(int i=0; i<7; i++)
        {
            Rectangle rect = new Rectangle(x+ i*x_size , y, x_size, y_size);
            drawText(g2d, cc[i], rect);
        }

        // 计算本月第一天是星期几
        Calendar cal = Calendar.getInstance();
        int theMonth = cal.get(Calendar.MONTH); // 当前是几月
        int theDay = cal.get(Calendar.DAY_OF_MONTH); // 当前是几号
        cal.set(Calendar.DAY_OF_MONTH, 1);// 向前推到本月第一天
        int weekday = cal.get(Calendar.DAY_OF_WEEK); // 计算本月第一天是周几
        System.out.println("week:" + weekday);

        // 往前推N天
        // Calendar里规定Sunday=1(周日), Monday=2, ..., Saturday=7(周六)
        // 它是周一,则前推0天,周二,推1天,周六,推5天,周日,推6天

        int start = weekday - Calendar.MONDAY;
        if(start <0) start = 6;
        cal.add(Calendar.DAY_OF_MONTH,  0 - start); // 前推,从上月开始显示

        // 绘制五行
        // 每月最多31天,可分五行显示
        x = 0;
        y += y_size;
        for(int i=0; i<5; i++) // 5行
        {
            for(int j=0; j<7; j++) // 7列
            {
                // 判断月份是否相同
                if(cal.get(Calendar.MONTH) == theMonth)
                {
                    g2d.setPaint(Color.BLACK);
                }
                else
                {
                    g2d.setPaint(Color.GRAY);
                }
                int day = cal.get(Calendar.DAY_OF_MONTH);
                Rectangle rect = new Rectangle(x+x_size*j, y+y_size*i, x_size, y_size);
                drawText(g2d, String.valueOf(day), rect);

                // 日期 +1
                cal.add(Calendar.DAY_OF_MONTH, 1);
            }
        }

    }

    // 将str绘制在矩形rect中,居中显示
    private void drawText(Graphics2D g2d, String str, Rectangle rect)
    {
        FontMetrics fm = g2d.getFontMetrics(g2d.getFont());
        int fontSize = fm.getHeight(); // 字高
        int textWidth = fm.stringWidth(str);
        int leading = fm.getLeading();
        int ascent = fm.getAscent(); // top -> baseline 的高度
        int descent = fm.getDescent(); // bottom->baseline 的高度
        // System.out.println(fontSize + "," + leading + "," + ascent + "," + descent);

        int x = 0, y = 0;
        x = rect.x + (rect.width - textWidth)/2; // 水平居中
        y = rect.y + rect.height /2 + (fontSize-leading)/2 - descent; // 竖直居中
        g2d.drawString(str, x, y);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值