import java.awt.Container;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.font.FontRenderContext;
import java.awt.font.LineBreakMeasurer;
import java.awt.font.TextAttribute;
import java.awt.font.TextLayout;
import java.text.AttributedCharacterIterator;
import java.text.AttributedString;
import java.util.Hashtable;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class MainClass {
public static void main(String[] args) {
JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container c = f.getContentPane();
c.add(new Justify());
f.pack();
f.setVisible(true);
}
}
class Justify extends JPanel {
final static int LEFT = 0;
final static int RIGHT = 1;
final static int CENTER = 2;
final static int EQUALITY = 3;
int justify = EQUALITY;
public void paint(Graphics g) {
Dimension size = getSize();
String s = "To rntsoft.com or not to rntsoft.com, that is a question";
Hashtable map = new Hashtable();
map.put(TextAttribute.SIZE, new Float(32.0f));
AttributedString as = new AttributedString(s, map);
map = new Hashtable();
map.put(TextAttribute.POSTURE, TextAttribute.POSTURE_OBLIQUE);
as.addAttributes(map, 33, 52);
AttributedCharacterIterator aci = as.getIterator();
int startIndex = aci.getBeginIndex();
int endIndex = aci.getEndIndex();
LineBreakMeasurer measurer;
measurer = new LineBreakMeasurer(aci, new FontRenderContext(null, false, false));
measurer.setPosition(startIndex);
float wrappingWidth = (float) size.width;
float Y = 0.0f;
while (measurer.getPosition() < endIndex) {
TextLayout layout = measurer.nextLayout(wrappingWidth);
Y += layout.getAscent();
float X = 0.0f;
switch (justify) {
case LEFT:
if (layout.isLeftToRight())
X = 0.0f;
else
X = wrappingWidth - layout.getAdvance();
break;
case RIGHT:
if (layout.isLeftToRight())
X = wrappingWidth - layout.getVisibleAdvance();
else
X = wrappingWidth;
break;
case CENTER:
if (layout.isLeftToRight())
X = (wrappingWidth - layout.getVisibleAdvance()) / 2;
else
X = (wrappingWidth + layout.getAdvance()) / 2 - layout.getAdvance();
break;
case EQUALITY:
layout = layout.getJustifiedLayout(wrappingWidth);
}
layout.draw((Graphics2D) g, X, Y);
Y += layout.getDescent() + layout.getLeading();
}
}
}