Skip to main content
Code Review

Return to Question

Commonmark migration
Source Link

About / Background##Background

import java.awt.Color;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class MyText
{
 private String string;
 private Image image;
 private final int x;
 private final int y; 
 private int w;
 private int h;
 private final Font font;
 private final Color color;
 
 private String delimeter = "...";
 
 private MyText (TextBuilder textBuilder) {
 string = textBuilder.string;
 font = textBuilder.font;
 color = textBuilder.color;
 
 x = textBuilder.x;
 y = textBuilder.y;
 
 w = textBuilder.w;
 h = textBuilder.h;
 
 delimeter = textBuilder.delimeter;
 
 image = stringToText (textBuilder.string); 
 } 
 public int getX () {
 return x;
 }
 public int getY () {
 return y;
 }
 public int getW () {
 return w;
 }
 public int getH () {
 return h;
 }
 
 public void render(Graphics g) {
 g.drawImage(image, x, y, null); 
 }
 
 public void invalidate (String s) {
 if (!string.equals(s)) {
 image = stringToText (s);
 }
 }
 private Image stringToText(String string) {
 BufferedImage img = new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB);
 Graphics2D g = img.createGraphics();
 g.setFont(font);
 FontMetrics fm = g.getFontMetrics();
 
 List<String> lines = new ArrayList<>(Arrays.asList(string.split("\\r?\\n")));
 
 // break longest lines based on width
 if (w > 0 && w < Integer.MAX_VALUE) {
 for (int i = 0; i < lines.size(); i++) {
 if (fm.stringWidth(lines.get(i)) > w) {
 List<String> words = new ArrayList<>(Arrays.asList(lines.get(i).split(" ")));
 String new_line = words.get(0);
 
 // word is too long
 if (fm.stringWidth(new_line) > w) {
 return null;
 }
 
 int j = 1;
 for (; j < words.size(); j++) {
 if (fm.stringWidth(" " + new_line + words.get(j)) < w) {
 new_line += " " + words.get(j);
 } else {
 lines.set(i, new_line); 
 break;
 }
 }
 
 String leftOver = "";
 
 for (; j < words.size(); j++) {
 leftOver += words.get(j) + " ";
 }
 leftOver = leftOver.substring(0, leftOver.length()-1);
 
 lines.add(i+1, leftOver);
 }
 }
 }
 
 // update width to the longest string
 w = 0;
 for (int i = 0; i < lines.size(); i++) {
 w = Math.max(w, fm.stringWidth(lines.get(i)));
 }
 
 // add delimiter if string passed height, find how many lines fit
 if (h < fm.getHeight() * lines.size()) {
 int index = lines.size();
 
 while (index-1 > h / fm.getHeight()) {
 index--;
 }
 
 String new_line = lines.get(index);
 
 while (fm.stringWidth(delimeter) + fm.stringWidth(new_line) > w) {
 // delimiter too long to fit at all
 if (fm.stringWidth(delimeter) > w) {
 break;
 }
 
 new_line = new_line.substring(0, new_line.lastIndexOf(' '));
 }
 
 new_line += delimeter;
 
 lines.remove(index);
 lines.add(index, new_line);
 
 for (int i = lines.size()-1; i > index ; i--) {
 lines.remove(lines.size()-1);
 }
 }
 
 // update height to the total lines
 h = fm.getHeight() * lines.size();
 
 // clean
 g.dispose();
 
 // render new image
 img = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
 g = img.createGraphics();
 g.setFont(font);
 fm = g.getFontMetrics();
 
 g.setColor(color);
 for (int i = 0; i < lines.size(); i++) {
 g.drawString(lines.get(i), 0, fm.getHeight()*(i+1)-4);
 }
 g.dispose();
 
 return img;
 }
 
 public static class TextBuilder
 {
 private final String string;
 private final int x;
 private final int y;
 private int w = Integer.MAX_VALUE;
 private int h = Integer.MAX_VALUE;
 private String delimeter = "...";
 private Font font = new Font("Verdana", 0, 12);
 private Color color = Color.BLACK;
 
 public TextBuilder (String string, int x, int y) {
 this.string = string;
 this.x = x;
 this.y = y;
 }
 
 public TextBuilder setMaxWidth (int w) {
 this.w = w;
 return this;
 }
 
 public TextBuilder setMaxBounds (int w, int h) {
 this.w = w;
 this.h = h; 
 return this;
 }
 
 public TextBuilder setDelimeter (String delimeter) {
 this.delimeter = delimeter;
 return this;
 }
 
 public TextBuilder fontSize (String name, int style, int size) {
 this.font = new Font (name, style, size);
 return this;
 }
 
 public TextBuilder color (Color color) {
 this.color = color;
 return this;
 }
 
 public MyText build () {
 return new MyText (this);
 }
 }
}
import java.awt.Canvas;
import java.awt.Dimension;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.image.BufferStrategy;
import test.MyText.TextBuilder;
public class MyMain extends Canvas implements Runnable
{
 MyText aLine = new TextBuilder ("Hello", 100, 100).build();
 MyText aList = new TextBuilder ("Hello, Hello, Hello, Hello, Hello, Hello, Hello, Hello", 200, 100).setMaxWidth(50).build();
 MyText aBox = new TextBuilder ("Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's. Wtf is this all about.", 300, 100).setMaxBounds(100, 100).build();
 
 public static void main (String[] args) {
 new MyMain (); 
 }
 
 public MyMain () {
 Frame frame = new Frame ();
 frame.add (this);
 frame.setPreferredSize(new Dimension(500,300));
 frame.pack ();
 frame.setLocationRelativeTo (null);
 frame.setVisible (true);
 
 // off we go
 Thread thread = new Thread(this);
 thread.start ();
 }
 @Override
 public void run() {
 while (true) {
 while (true) {
 BufferStrategy bufferstrategy = getBufferStrategy ();
 
 if (bufferstrategy == null) {
 createBufferStrategy(3);
 break;
 }
 
 Graphics g = bufferstrategy.getDrawGraphics(); 
 g.clearRect(0, 0, 500, 300);
 
 /* Test Cases Begin */ 
 aLine.render(g);
 aList.render(g);
 aBox.render(g);
 /* Test Cases End */
 
 g.dispose();
 bufferstrategy.show();
 }
 }
 }
}

About / Background##

import java.awt.Color;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class MyText
{
 private String string;
 private Image image;
 private final int x;
 private final int y; 
 private int w;
 private int h;
 private final Font font;
 private final Color color;
 
 private String delimeter = "...";
 
 private MyText (TextBuilder textBuilder) {
 string = textBuilder.string;
 font = textBuilder.font;
 color = textBuilder.color;
 
 x = textBuilder.x;
 y = textBuilder.y;
 
 w = textBuilder.w;
 h = textBuilder.h;
 
 delimeter = textBuilder.delimeter;
 
 image = stringToText (textBuilder.string); 
 } 
 public int getX () {
 return x;
 }
 public int getY () {
 return y;
 }
 public int getW () {
 return w;
 }
 public int getH () {
 return h;
 }
 
 public void render(Graphics g) {
 g.drawImage(image, x, y, null); 
 }
 
 public void invalidate (String s) {
 if (!string.equals(s)) {
 image = stringToText (s);
 }
 }
 private Image stringToText(String string) {
 BufferedImage img = new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB);
 Graphics2D g = img.createGraphics();
 g.setFont(font);
 FontMetrics fm = g.getFontMetrics();
 
 List<String> lines = new ArrayList<>(Arrays.asList(string.split("\\r?\\n")));
 
 // break longest lines based on width
 if (w > 0 && w < Integer.MAX_VALUE) {
 for (int i = 0; i < lines.size(); i++) {
 if (fm.stringWidth(lines.get(i)) > w) {
 List<String> words = new ArrayList<>(Arrays.asList(lines.get(i).split(" ")));
 String new_line = words.get(0);
 
 // word is too long
 if (fm.stringWidth(new_line) > w) {
 return null;
 }
 
 int j = 1;
 for (; j < words.size(); j++) {
 if (fm.stringWidth(" " + new_line + words.get(j)) < w) {
 new_line += " " + words.get(j);
 } else {
 lines.set(i, new_line); 
 break;
 }
 }
 
 String leftOver = "";
 
 for (; j < words.size(); j++) {
 leftOver += words.get(j) + " ";
 }
 leftOver = leftOver.substring(0, leftOver.length()-1);
 
 lines.add(i+1, leftOver);
 }
 }
 }
 
 // update width to the longest string
 w = 0;
 for (int i = 0; i < lines.size(); i++) {
 w = Math.max(w, fm.stringWidth(lines.get(i)));
 }
 
 // add delimiter if string passed height, find how many lines fit
 if (h < fm.getHeight() * lines.size()) {
 int index = lines.size();
 
 while (index-1 > h / fm.getHeight()) {
 index--;
 }
 
 String new_line = lines.get(index);
 
 while (fm.stringWidth(delimeter) + fm.stringWidth(new_line) > w) {
 // delimiter too long to fit at all
 if (fm.stringWidth(delimeter) > w) {
 break;
 }
 
 new_line = new_line.substring(0, new_line.lastIndexOf(' '));
 }
 
 new_line += delimeter;
 
 lines.remove(index);
 lines.add(index, new_line);
 
 for (int i = lines.size()-1; i > index ; i--) {
 lines.remove(lines.size()-1);
 }
 }
 
 // update height to the total lines
 h = fm.getHeight() * lines.size();
 
 // clean
 g.dispose();
 
 // render new image
 img = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
 g = img.createGraphics();
 g.setFont(font);
 fm = g.getFontMetrics();
 
 g.setColor(color);
 for (int i = 0; i < lines.size(); i++) {
 g.drawString(lines.get(i), 0, fm.getHeight()*(i+1)-4);
 }
 g.dispose();
 
 return img;
 }
 
 public static class TextBuilder
 {
 private final String string;
 private final int x;
 private final int y;
 private int w = Integer.MAX_VALUE;
 private int h = Integer.MAX_VALUE;
 private String delimeter = "...";
 private Font font = new Font("Verdana", 0, 12);
 private Color color = Color.BLACK;
 
 public TextBuilder (String string, int x, int y) {
 this.string = string;
 this.x = x;
 this.y = y;
 }
 
 public TextBuilder setMaxWidth (int w) {
 this.w = w;
 return this;
 }
 
 public TextBuilder setMaxBounds (int w, int h) {
 this.w = w;
 this.h = h; 
 return this;
 }
 
 public TextBuilder setDelimeter (String delimeter) {
 this.delimeter = delimeter;
 return this;
 }
 
 public TextBuilder fontSize (String name, int style, int size) {
 this.font = new Font (name, style, size);
 return this;
 }
 
 public TextBuilder color (Color color) {
 this.color = color;
 return this;
 }
 
 public MyText build () {
 return new MyText (this);
 }
 }
}
import java.awt.Canvas;
import java.awt.Dimension;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.image.BufferStrategy;
import test.MyText.TextBuilder;
public class MyMain extends Canvas implements Runnable
{
 MyText aLine = new TextBuilder ("Hello", 100, 100).build();
 MyText aList = new TextBuilder ("Hello, Hello, Hello, Hello, Hello, Hello, Hello, Hello", 200, 100).setMaxWidth(50).build();
 MyText aBox = new TextBuilder ("Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's. Wtf is this all about.", 300, 100).setMaxBounds(100, 100).build();
 
 public static void main (String[] args) {
 new MyMain (); 
 }
 
 public MyMain () {
 Frame frame = new Frame ();
 frame.add (this);
 frame.setPreferredSize(new Dimension(500,300));
 frame.pack ();
 frame.setLocationRelativeTo (null);
 frame.setVisible (true);
 
 // off we go
 Thread thread = new Thread(this);
 thread.start ();
 }
 @Override
 public void run() {
 while (true) {
 while (true) {
 BufferStrategy bufferstrategy = getBufferStrategy ();
 
 if (bufferstrategy == null) {
 createBufferStrategy(3);
 break;
 }
 
 Graphics g = bufferstrategy.getDrawGraphics(); 
 g.clearRect(0, 0, 500, 300);
 
 /* Test Cases Begin */ 
 aLine.render(g);
 aList.render(g);
 aBox.render(g);
 /* Test Cases End */
 
 g.dispose();
 bufferstrategy.show();
 }
 }
 }
}

About / Background

import java.awt.Color;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class MyText
{
 private String string;
 private Image image;
 private final int x;
 private final int y; 
 private int w;
 private int h;
 private final Font font;
 private final Color color;
 
 private String delimeter = "...";
 
 private MyText (TextBuilder textBuilder) {
 string = textBuilder.string;
 font = textBuilder.font;
 color = textBuilder.color;
 
 x = textBuilder.x;
 y = textBuilder.y;
 
 w = textBuilder.w;
 h = textBuilder.h;
 
 delimeter = textBuilder.delimeter;
 
 image = stringToText (textBuilder.string); 
 } 
 public int getX () {
 return x;
 }
 public int getY () {
 return y;
 }
 public int getW () {
 return w;
 }
 public int getH () {
 return h;
 }
 
 public void render(Graphics g) {
 g.drawImage(image, x, y, null); 
 }
 
 public void invalidate (String s) {
 if (!string.equals(s)) {
 image = stringToText (s);
 }
 }
 private Image stringToText(String string) {
 BufferedImage img = new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB);
 Graphics2D g = img.createGraphics();
 g.setFont(font);
 FontMetrics fm = g.getFontMetrics();
 
 List<String> lines = new ArrayList<>(Arrays.asList(string.split("\\r?\\n")));
 
 // break longest lines based on width
 if (w > 0 && w < Integer.MAX_VALUE) {
 for (int i = 0; i < lines.size(); i++) {
 if (fm.stringWidth(lines.get(i)) > w) {
 List<String> words = new ArrayList<>(Arrays.asList(lines.get(i).split(" ")));
 String new_line = words.get(0);
 
 // word is too long
 if (fm.stringWidth(new_line) > w) {
 return null;
 }
 
 int j = 1;
 for (; j < words.size(); j++) {
 if (fm.stringWidth(" " + new_line + words.get(j)) < w) {
 new_line += " " + words.get(j);
 } else {
 lines.set(i, new_line); 
 break;
 }
 }
 
 String leftOver = "";
 
 for (; j < words.size(); j++) {
 leftOver += words.get(j) + " ";
 }
 leftOver = leftOver.substring(0, leftOver.length()-1);
 
 lines.add(i+1, leftOver);
 }
 }
 }
 
 // update width to the longest string
 w = 0;
 for (int i = 0; i < lines.size(); i++) {
 w = Math.max(w, fm.stringWidth(lines.get(i)));
 }
 
 // add delimiter if string passed height, find how many lines fit
 if (h < fm.getHeight() * lines.size()) {
 int index = lines.size();
 
 while (index-1 > h / fm.getHeight()) {
 index--;
 }
 
 String new_line = lines.get(index);
 
 while (fm.stringWidth(delimeter) + fm.stringWidth(new_line) > w) {
 // delimiter too long to fit at all
 if (fm.stringWidth(delimeter) > w) {
 break;
 }
 
 new_line = new_line.substring(0, new_line.lastIndexOf(' '));
 }
 
 new_line += delimeter;
 
 lines.remove(index);
 lines.add(index, new_line);
 
 for (int i = lines.size()-1; i > index ; i--) {
 lines.remove(lines.size()-1);
 }
 }
 
 // update height to the total lines
 h = fm.getHeight() * lines.size();
 
 // clean
 g.dispose();
 
 // render new image
 img = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
 g = img.createGraphics();
 g.setFont(font);
 fm = g.getFontMetrics();
 
 g.setColor(color);
 for (int i = 0; i < lines.size(); i++) {
 g.drawString(lines.get(i), 0, fm.getHeight()*(i+1)-4);
 }
 g.dispose();
 
 return img;
 }
 
 public static class TextBuilder
 {
 private final String string;
 private final int x;
 private final int y;
 private int w = Integer.MAX_VALUE;
 private int h = Integer.MAX_VALUE;
 private String delimeter = "...";
 private Font font = new Font("Verdana", 0, 12);
 private Color color = Color.BLACK;
 
 public TextBuilder (String string, int x, int y) {
 this.string = string;
 this.x = x;
 this.y = y;
 }
 
 public TextBuilder setMaxWidth (int w) {
 this.w = w;
 return this;
 }
 
 public TextBuilder setMaxBounds (int w, int h) {
 this.w = w;
 this.h = h; 
 return this;
 }
 
 public TextBuilder setDelimeter (String delimeter) {
 this.delimeter = delimeter;
 return this;
 }
 
 public TextBuilder fontSize (String name, int style, int size) {
 this.font = new Font (name, style, size);
 return this;
 }
 
 public TextBuilder color (Color color) {
 this.color = color;
 return this;
 }
 
 public MyText build () {
 return new MyText (this);
 }
 }
}
import java.awt.Canvas;
import java.awt.Dimension;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.image.BufferStrategy;
import test.MyText.TextBuilder;
public class MyMain extends Canvas implements Runnable
{
 MyText aLine = new TextBuilder ("Hello", 100, 100).build();
 MyText aList = new TextBuilder ("Hello, Hello, Hello, Hello, Hello, Hello, Hello, Hello", 200, 100).setMaxWidth(50).build();
 MyText aBox = new TextBuilder ("Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's. Wtf is this all about.", 300, 100).setMaxBounds(100, 100).build();
 
 public static void main (String[] args) {
 new MyMain (); 
 }
 
 public MyMain () {
 Frame frame = new Frame ();
 frame.add (this);
 frame.setPreferredSize(new Dimension(500,300));
 frame.pack ();
 frame.setLocationRelativeTo (null);
 frame.setVisible (true);
 
 // off we go
 Thread thread = new Thread(this);
 thread.start ();
 }
 @Override
 public void run() {
 while (true) {
 while (true) {
 BufferStrategy bufferstrategy = getBufferStrategy ();
 
 if (bufferstrategy == null) {
 createBufferStrategy(3);
 break;
 }
 
 Graphics g = bufferstrategy.getDrawGraphics(); 
 g.clearRect(0, 0, 500, 300);
 
 /* Test Cases Begin */ 
 aLine.render(g);
 aList.render(g);
 aBox.render(g);
 /* Test Cases End */
 
 g.dispose();
 bufferstrategy.show();
 }
 }
 }
}
replaced http://codereview.stackexchange.com/ with https://codereview.stackexchange.com/
Source Link

This is indirectly a follow up from: General Game Loop 3.0 General Game Loop 3.0, if you prefer to test against it, feel free to. That code is very outdated now though. A test suite is given at the end.

This is indirectly a follow up from: General Game Loop 3.0, if you prefer to test against it, feel free to. That code is very outdated now though. A test suite is given at the end.

This is indirectly a follow up from: General Game Loop 3.0, if you prefer to test against it, feel free to. That code is very outdated now though. A test suite is given at the end.

rawr typo, and that ` smells like edit error to me
Source Link
Pimgd
  • 22.5k
  • 5
  • 68
  • 144
private String delimeter = "...";
private Font font = new Font("Verdana", 0, 12);
private Color color = Color.BLACK;`BLACK;

ExpalanationExplanation

private String delimeter = "...";
private Font font = new Font("Verdana", 0, 12);
private Color color = Color.BLACK;`

Expalanation

private String delimeter = "...";
private Font font = new Font("Verdana", 0, 12);
private Color color = Color.BLACK;

Explanation

Notice removed Draw attention by Community Bot
Bounty Ended with no winning answer by Community Bot
Tweeted twitter.com/StackCodeReview/status/680146353490673664
Notice added Draw attention by Emz
Bounty Started worth 50 reputation by Emz
Source Link
Emz
  • 1k
  • 1
  • 8
  • 24
Loading
lang-java

AltStyle によって変換されたページ (->オリジナル) /