Java Graphics实现界面显示文字并换行

目录
  • 实现效果
  • 实现代码
    • Main.java
    • AlgoFrame.java

实现效果

问题是没有很好的换行

在调用时显示想处理的字符

实现代码

Main.java

 public class Main {

    public  static void main(String[] strings)
    {
        String poem = "破阵子·为陈同甫赋壮词以寄之\r\n"
        + "作者:辛弃疾\r\n"
        + "\r\n"
        + "醉里挑灯看剑,梦回吹角连营。八百里分麾下炙,五十弦翻塞外声,沙场秋点兵。\r\n"
        + "马作的卢飞快,弓如霹雳弦惊。了却君王天下事,赢得生前身后名。可怜白发生!";

        AlgoFrame frame = new AlgoFrame("Java",poem, 600, 600);
        System.out.print("行路难,行路难,多歧路,今安在?\n"
                + "醉里挑灯看剑,梦回吹角连营");
    }
}

AlgoFrame.java

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Rectangle2D;

import javax.swing.*;

public class AlgoFrame extends JFrame {
    private int canvasWidth;
    private int canvasHeight;
    public AlgoFrame(String title, String poem, int canvasWidth, int canvasHeight){

        super(title);

        this.canvasHeight = canvasHeight;
        this.canvasWidth = canvasWidth;

//        AlgoCanvas canvas = new AlgoCanvas();
        AlgoCanvas canvas = new AlgoCanvas(poem);

        setContentPane(canvas);
        pack();

        setResizable(false);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
    }

    public AlgoFrame(String title){
        this(title, "", 1024, 768);
    }

    public int getCanvasWidth(){return  canvasWidth;}
    public int setCanvasHeight() {return canvasHeight;}

    private class AlgoCanvas extends JPanel{

        Font pf = new Font("Helvetica", Font.BOLD,20);
        String poem = "";

//        String poem = "破阵子·为陈同甫赋壮词以寄之\r\n"
//                + "作者:辛弃疾\r\n"
//                + "\r\n"
//                + "醉里挑灯看剑,梦回吹角连营。八百里分麾下炙,五十弦翻塞外声,沙场秋点兵。\r\n"
//                + "马作的卢飞快,弓如霹雳弦惊。了却君王天下事,赢得生前身后名。可怜白发生!";

        public AlgoCanvas (String strs) {
            this.poem = strs;
        }

        @Override
        public void paintComponent(Graphics gra) {

            Graphics2D graphics2d = (Graphics2D)gra;
            int strokeWidth = 5;
            graphics2d.setStroke(new BasicStroke(strokeWidth));

            graphics2d.setColor(Color.RED);
            Ellipse2D circle = new Ellipse2D.Double(60, 60, 300, 300);
            graphics2d.draw(circle);

            graphics2d.setColor(Color.BLACK);
            Rectangle2D rect = new Rectangle2D.Double(50, 50, 320, 320);
            graphics2d.draw(rect);

            graphics2d.setColor(Color.blue);
            Ellipse2D circle2 = new Ellipse2D.Float(80, 80, 260, 260);
//            graphics2d.draw(circle2);
            graphics2d.fill(circle2);

//            显示辛弃疾的词
            graphics2d.setColor(Color.black);
//            graphics2d.setFont(pf);
//            graphics2d.drawString(poem, 10, canvasHeight-100);

            drawStringWithFontStyleLineFeed(graphics2d,poem, 10, canvasHeight-100, pf);

        }

        @Override
        public Dimension getPreferredSize() {
//            System.out.println("running");
            return new Dimension(canvasWidth, canvasHeight);
        }

        //字符串总宽度
        private int  getStringLength(Graphics g, String str) {
            char[]  strcha=str.toCharArray();
            int strWidth = g.getFontMetrics().charsWidth(strcha, 0, str.length());
            System.out.println("字符总宽度:"+strWidth);
            return strWidth;
        }

//        //每一行字符串宽度  自定义  也就是画布中一行的宽度
//        int rowWidth=1110;
//        //字符串字符的个数
//        int strnum= str.length();
//        //每一行字符的个数

        private int getRowStrNum(int strnum,int rowWidth,int strWidth)
        {
            int rowstrnum=0;
            rowstrnum=(rowWidth*strnum)/strWidth;
            System.out.println("每行的字符数:"+rowstrnum);
            return rowstrnum;
        }

        //字符行数
        private  int  getRows(int strWidth,int rowWidth){
            int rows=0;
            if(strWidth%rowWidth>0){
                rows=strWidth/rowWidth+1;
            }else{
                rows=strWidth/rowWidth;
            }
            System.out.println("行数:"+rows);
            return rows;
        }

        //字符高度
        private int  getStringHeight(Graphics g) {
            int height = g.getFontMetrics().getHeight();
            System.out.println("字符高度:"+height);
            return height;
        }

//        注意设置font 才能计算宽度和高度
//        开始绘制
        private  void  drawStringWithFontStyleLineFeed(Graphics g, String strContent, int loc_X, int loc_Y, Font font)
        {
            g.setFont(font);

            //获取字符串 字符的总宽度
            int strWidth = getStringLength(g,strContent);

            //每一行字符串宽度
            int rowWidth = 500;
            System.out.println("每行字符宽度:"+rowWidth);

            //获取字符高度
            int strHeight=getStringHeight(g);

            //字符串总个数
            System.out.println("字符串总个数:"+strContent.length());
            if(strWidth>rowWidth){

                int rowstrnum=getRowStrNum(strContent.length(),rowWidth,strWidth);
                int  rows= getRows(strWidth,rowWidth);

                String temp="";
                for (int i = 0; i < rows; i++) {
                    //获取各行的String
                    if(i==rows-1){
                        //最后一行
                        temp=strContent.substring(i*rowstrnum,strContent.length());
                    }else{
                        temp=strContent.substring(i*rowstrnum,i*rowstrnum+rowstrnum);
                    }
                    if(i>0){
                        //第一行不需要增加字符高度,以后的每一行在换行的时候都需要增加字符高度
                        loc_Y=loc_Y+strHeight;
                    }
                    g.drawString(temp, loc_X, loc_Y);
                }
            }else{
                //直接绘制
                g.drawString(strContent, loc_X, loc_Y);
            }

        }
    }

}

到此这篇关于Java Graphics实现界面显示文字并换行的文章就介绍到这了,更多相关Java Graphics界面显示文字内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • java 使用Graphics2D在图片上写字

    目录 使用Graphics2D在图片上写字 Graphics2D 的使用 1.Graphics2D和Graphics的区别 2.setRenderingHint的具体用处 3.Stroke的使用方法 使用Graphics2D在图片上写字 首先jsp页面:src是一个方法地址 然后在Controller如下:写一个生成方法,用流进行读写 生成方法,(关键): 注意:这种方法可行,但是需要计算文字的位置,感觉不太灵活,如果谁有更好的方法请分享一下. Graphics2D 的使用 1.Graphics

  • java使用Graphics2D绘图/画图方式

    目录 一.笔者在开发过程中遇到生成分享海报的需求 二.Graphics2D常用API 三.上才艺 四.输出图片 五.总结 一.笔者在开发过程中遇到生成分享海报的需求 需要后端动态生成分享图(最终前端自己实现的,哈哈):记录下过程中遇到的一些问题和解决办法. 二.Graphics2D常用API 首先获取Graphics2D实例 BufferedImage bi = new BufferedImage(imageWidth, imageHeight, BufferedImage.TYPE_INT_R

  • Java中的Graphics2D类基本使用教程

    Java语言在Graphics类提供绘制各种基本的几何图形的基础上,扩展Graphics类提供一个Graphics2D类,它拥用更强大的二维图形处理能力,提供.坐标转换.颜色管理以及文字布局等更精确的控制. 绘图属性 Graphics2D定义了几种方法,用于添加或改变图形的状态属性.可以通过设定和修改状态属性,指定画笔宽度和画笔的连接方式:设定平移.旋转.缩放或修剪变换图形:以及设定填充图形的颜色和图案等.图形状态属性用特定的对象存储. 1. stroke属性 stroke属性控制线条的宽度.笔

  • 使用Java的Graphics类进行绘图的方法详解

    Graphics类提供基本绘图方法,Graphics2D类提供更强大的绘图能力.本节讲解Graphics类,下节讲解Graphics2D. Graphics类提供基本的几何图形绘制方法,主要有:画线段.画矩形.画圆.画带颜色的图形.画椭圆.画圆弧.画多边形等. 1. 画线 在窗口画一条线段,可以使用Graphics类的drawLine()方法: drawLine(int x1,int y1,int x2,int y2) 例如,以下代码在点(3,3)与点(50,50)之间画线段,在点(100,10

  • Java Graphics实现界面显示文字并换行

    目录 实现效果 实现代码 Main.java AlgoFrame.java 实现效果 问题是没有很好的换行 在调用时显示想处理的字符 实现代码 Main.java public class Main { public static void main(String[] strings) { String poem = "破阵子·为陈同甫赋壮词以寄之\r\n" + "作者:辛弃疾\r\n" + "\r\n" + "醉里挑灯看剑,梦回吹角连

  • Android自定View流式布局根据文字数量换行

    本文实例为大家分享了Android根据文字数量换行的具体代码,供大家参考,具体内容如下 //主页 定义数据框 package com.example.customwaterfallviewgroup; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.EditText; import java.util

  • jsp实现textarea中的文字保存换行空格存到数据库的方法

    UploadNews.jsp <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dt

  • Java中字符串根据宽度(像素)换行的问题

    目录 Java 字符串根据宽度(像素)换行 根据像素宽度进行换行 Java字符串根据宽度(像素)进行换行及Pdf合并 1.工具类最终版前奏 2.工具类最终版 3.项目中具体使用 3.1 controller层 3.2 serviceImpl层 4.工具类补充 Java 字符串根据宽度(像素)换行 在一些场景下,我们经常会通过判断字符串的长度,比如个数来实现换行,但是中文.英文.数字.其实在展示的时候同样长度的字符串,其实它的宽度是不一样的,这也是们我通俗意义上说的宽度(像素) 根据像素宽度进行换

  • Java版本的回文字算法(java版本)

    废话不多说了,直接给大家贴代码了,具体代码如下所述: package com.gdh.backtext; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; public class BackText { String text; public BackText() { super(); this.text = null; } public BackText(String text) { supe

  • 浅谈Android textview文字对齐换行的问题

    今天忽然发现android项目中的文字排版参差不齐的情况非常严重,不得不想办法解决一下. 经过研究之后,终于找到了textview自动换行导致混乱的原因了----半角字符与全角字符混乱所致!一般情况下,我们输入的数字.字母以及英文标点都是半角,所以占位无法确定. 它们与汉字的占位大大的不同,由于这个原因,导致很多文字的排版都是参差不齐的. 对此我找到了两种办法可以解决这个问题: 1. 将textview中的字符全角化. 即将所有的数字.字母及标点全部转为全角字符,使它们与汉字同占两个字节,这样就

  • 微信小程序文字显示换行问题

    小程序文字显示换行 问题 用户在上传图文时,输入换行符.导致我在拿到数据后JSON.parse的时候报错. 大概这样的结构: [{ text:'落魄前端 在线炒粉!!!' , url:'' },{ text:'' , url:'xxx.jpg', }]  解决 在拿到数据时先进行正则匹配处理,将换行替换为\n data.replace(/\n/g,'\\n') 然后在进行JOSN.parse就无问题啦. 还要注意的是要使用 text 标签输出才会有换行显示喔. ps:下面看下微信小程序文字超出自

  • java实现百度云文字识别接口代码

    本文实例为大家分享了java实现百度云文字识别的接口具体代码,供大家参考,具体内容如下 public class Images { public static String getResult() { String otherHost = "https://aip.baidubce.com/rest/2.0/ocr/v1/general"; // 本地图片路径 String str="你的本地图片路径" String filePath = "str&quo

  • 解决java Graphics drawImage 无法显示图片的问题

    目录 java Graphics drawImage无法显示图片 解决方案:总结为两个问题 drawImage()第一次调用图片不成功 解决方案:把所有图片都加载一次 解决方案:使用MediaTracker类 java Graphics drawImage无法显示图片 package com.sitech.test; import java.awt.Dimension; import java.awt.EventQueue; import java.awt.Graphics; import ja

  • java 百度手写文字识别接口配置代码

    代码如下所示: package org.fh.util; import org.json.JSONObject; import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; import java.util.List; import java.util.Map; /** * 说明:获取文字识别token类 * 作者:

随机推荐