Java 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)文章
LinkedList學(xué)習(xí)示例模擬堆棧與隊列數(shù)據(jù)結(jié)構(gòu)
這篇文章主要介紹了LinkedList學(xué)習(xí)示例,模擬一個堆棧與隊列數(shù)據(jù)結(jié)構(gòu),大家參考使用吧2014-01-01
kafka生產(chǎn)者發(fā)送消息流程深入分析講解
本文將介紹kafka的一條消息的發(fā)送流程,從消息的發(fā)送到服務(wù)端的存儲。上文說到kafak分為客戶端與服務(wù)端,要發(fā)送消息就涉及到了網(wǎng)絡(luò)通訊,kafka采用TCP協(xié)議進行客戶端與服務(wù)端的通訊協(xié)議2023-03-03
java應(yīng)用程序如何自定義log4j配置文件的位置
這篇文章主要介紹了java應(yīng)用程序如何自定義log4j配置文件的位置,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-12-12
Java內(nèi)存溢出的幾個區(qū)域總結(jié)(注意避坑!)
內(nèi)存溢出是指應(yīng)用系統(tǒng)中存在無法回收的內(nèi)存或使用的內(nèi)存過多,最終使得程序運行要用到的內(nèi)存大于虛擬機能提供的最大內(nèi)存,下面這篇文章主要給大家介紹了關(guān)于Java內(nèi)存溢出的幾個區(qū)域,總結(jié)出來給大家提醒注意避坑,需要的朋友可以參考下2022-11-11
常用數(shù)字簽名算法RSA與DSA的Java程序內(nèi)實現(xiàn)示例
這篇文章主要介紹了常用數(shù)字簽名算法RSA與DSA的Java程序內(nèi)實現(xiàn)示例,一般來說DSA算法用于簽名的效率會比RSA要快,需要的朋友可以參考下2016-04-04

