Java中Graphics类提供了一些基本的几何图形绘制方法,本文将利用Graphics实现界面显示文字并换行效果,感兴趣的小伙伴可以动手尝试一下
实现效果
问题是没有很好的换行
在调用时显示想处理的字符
实现代码
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界面显示文字内容请搜索编程学习网以前的文章希望大家以后多多支持编程学习网!
沃梦达教程
本文标题为:Java Graphics实现界面显示文字并换行
猜你喜欢
- ExecutorService Callable Future多线程返回结果原理解析 2023-06-01
- JSP页面间传值问题实例简析 2023-08-03
- SpringBoot使用thymeleaf实现一个前端表格方法详解 2023-06-06
- JSP 制作验证码的实例详解 2023-07-30
- 基于Java Agent的premain方式实现方法耗时监控问题 2023-06-17
- Java中的日期时间处理及格式化处理 2023-04-18
- Springboot整合minio实现文件服务的教程详解 2022-12-03
- Spring Security权限想要细化到按钮实现示例 2023-03-07
- Java实现顺序表的操作详解 2023-05-19
- 深入了解Spring的事务传播机制 2023-06-02