Java Graphics實現(xiàn)界面顯示文字并換行
更新時間:2022年08月21日 09:55:17 作者:天人合一peng
Java中Graphics類提供了一些基本的幾何圖形繪制方法,本文將利用Graphics實現(xiàn)界面顯示文字并換行效果,感興趣的小伙伴可以動手嘗試一下
實現(xiàn)效果

問題是沒有很好的換行
在調(diào)用時顯示想處理的字符
實現(xiàn)代碼
Main.java
public class Main {
public static void main(String[] strings)
{
String poem = "破陣子·為陳同甫賦壯詞以寄之\r\n"
+ "作者:辛棄疾\r\n"
+ "\r\n"
+ "醉里挑燈看劍,夢回吹角連營。八百里分麾下炙,五十弦翻塞外聲,沙場秋點兵。\r\n"
+ "馬作的盧飛快,弓如霹靂弦驚。了卻君王天下事,贏得生前身后名??蓱z白發(fā)生!";
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"
// + "馬作的盧飛快,弓如霹靂弦驚。了卻君王天下事,贏得生前身后名??蓱z白發(fā)生!";
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;
// //字符串字符的個數(shù)
// int strnum= str.length();
// //每一行字符的個數(shù)
private int getRowStrNum(int strnum,int rowWidth,int strWidth)
{
int rowstrnum=0;
rowstrnum=(rowWidth*strnum)/strWidth;
System.out.println("每行的字符數(shù):"+rowstrnum);
return rowstrnum;
}
//字符行數(shù)
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("行數(shù):"+rows);
return rows;
}
//字符高度
private int getStringHeight(Graphics g) {
int height = g.getFontMetrics().getHeight();
System.out.println("字符高度:"+height);
return height;
}
// 注意設(shè)置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);
//字符串總個數(shù)
System.out.println("字符串總個數(shù):"+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);
}
}
}
}
到此這篇關(guān)于Java Graphics實現(xiàn)界面顯示文字并換行的文章就介紹到這了,更多相關(guān)Java Graphics界面顯示文字內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringCloud Sleuth實現(xiàn)分布式請求鏈路跟蹤流程詳解
這篇文章主要介紹了SpringCloud Sleuth實現(xiàn)分布式請求鏈路跟蹤流程,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2022-11-11
Shiro + JWT + SpringBoot應(yīng)用示例代碼詳解
這篇文章主要介紹了Shiro (Shiro + JWT + SpringBoot應(yīng)用),本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-06-06

