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();
}
}
}
}
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.
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