Java Graphics實(shí)現(xiàn)界面顯示文字并換行
實(shí)現(xiàn)效果
問(wèn)題是沒(méi)有很好的換行
在調(diào)用時(shí)顯示想處理的字符
實(shí)現(xiàn)代碼
Main.java
public class Main { public static void main(String[] strings) { String poem = "破陣子·為陳同甫賦壯詞以寄之\r\n" + "作者:辛棄疾\r\n" + "\r\n" + "醉里挑燈看劍,夢(mèng)回吹角連營(yíng)。八百里分麾下炙,五十弦翻塞外聲,沙場(chǎng)秋點(diǎn)兵。\r\n" + "馬作的盧飛快,弓如霹靂弦驚。了卻君王天下事,贏得生前身后名??蓱z白發(fā)生!"; AlgoFrame frame = new AlgoFrame("Java",poem, 600, 600); System.out.print("行路難,行路難,多歧路,今安在?\n" + "醉里挑燈看劍,夢(mèng)回吹角連營(yíng)"); } }
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" // + "醉里挑燈看劍,夢(mèng)回吹角連營(yíng)。八百里分麾下炙,五十弦翻塞外聲,沙場(chǎng)秋點(diǎ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; } // //每一行字符串寬度 自定義 也就是畫(huà)布中一行的寬度 // int rowWidth=1110; // //字符串字符的個(gè)數(shù) // int strnum= str.length(); // //每一行字符的個(gè)數(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 才能計(jì)算寬度和高度 // 開(kāi)始繪制 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); //字符串總個(gè)數(shù) System.out.println("字符串總個(gè)數(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){ //第一行不需要增加字符高度,以后的每一行在換行的時(shí)候都需要增加字符高度 loc_Y=loc_Y+strHeight; } g.drawString(temp, loc_X, loc_Y); } }else{ //直接繪制 g.drawString(strContent, loc_X, loc_Y); } } } }
到此這篇關(guān)于Java Graphics實(shí)現(xiàn)界面顯示文字并換行的文章就介紹到這了,更多相關(guān)Java Graphics界面顯示文字內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
LinkedList學(xué)習(xí)示例模擬堆棧與隊(duì)列數(shù)據(jù)結(jié)構(gòu)
這篇文章主要介紹了LinkedList學(xué)習(xí)示例,模擬一個(gè)堆棧與隊(duì)列數(shù)據(jù)結(jié)構(gòu),大家參考使用吧2014-01-01Java類(lèi)加載機(jī)制實(shí)現(xiàn)步驟解析
這篇文章主要介紹了Java類(lèi)加載機(jī)制實(shí)現(xiàn)步驟解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-03-03kafka生產(chǎn)者發(fā)送消息流程深入分析講解
本文將介紹kafka的一條消息的發(fā)送流程,從消息的發(fā)送到服務(wù)端的存儲(chǔ)。上文說(shuō)到kafak分為客戶端與服務(wù)端,要發(fā)送消息就涉及到了網(wǎng)絡(luò)通訊,kafka采用TCP協(xié)議進(jìn)行客戶端與服務(wù)端的通訊協(xié)議2023-03-03java應(yīng)用程序如何自定義log4j配置文件的位置
這篇文章主要介紹了java應(yīng)用程序如何自定義log4j配置文件的位置,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12Java內(nèi)存溢出的幾個(gè)區(qū)域總結(jié)(注意避坑!)
內(nèi)存溢出是指應(yīng)用系統(tǒng)中存在無(wú)法回收的內(nèi)存或使用的內(nèi)存過(guò)多,最終使得程序運(yùn)行要用到的內(nèi)存大于虛擬機(jī)能提供的最大內(nèi)存,下面這篇文章主要給大家介紹了關(guān)于Java內(nèi)存溢出的幾個(gè)區(qū)域,總結(jié)出來(lái)給大家提醒注意避坑,需要的朋友可以參考下2022-11-11常用數(shù)字簽名算法RSA與DSA的Java程序內(nèi)實(shí)現(xiàn)示例
這篇文章主要介紹了常用數(shù)字簽名算法RSA與DSA的Java程序內(nèi)實(shí)現(xiàn)示例,一般來(lái)說(shuō)DSA算法用于簽名的效率會(huì)比RSA要快,需要的朋友可以參考下2016-04-04Java?面向?qū)ο笸ㄟ^(guò)new揭開(kāi)對(duì)象實(shí)例化
各位鐵汁們大家好呀,我們上次博客講了,通過(guò)?Student?student1?=?new?Student();就可以實(shí)例化一個(gè)對(duì)象,這個(gè)對(duì)象就有Student類(lèi)中的所以成員變量??墒?對(duì)象student1?和?類(lèi)Student到底是怎樣建立聯(lián)系的,在內(nèi)存中到底發(fā)生了什么2022-04-04