import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.RenderingHints;
import java.awt.font.LineBreakMeasurer;
import java.awt.font.TextAttribute;
import java.awt.font.TextLayout;
import java.text.AttributedString;import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;public class ChineseVertical {    public static void main(final String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                final JFrame frame = new JFrame();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.getContentPane().add(new DisplayPanel());
                frame.setBounds(100,100,300,500);
                frame.setVisible(true);
            }
        });
    }
}class DisplayPanel extends JPanel{
    private String chinese = "我是中国人, 炎黄传人";    @Override
    public void paintComponent(final Graphics g) {
        final Graphics2D g2d = (Graphics2D) g;
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);        final Font font = new Font("黑体",Font.PLAIN,24);        final AttributedString s = new AttributedString(chinese);
        s.addAttribute(TextAttribute.FONT, font);
        s.addAttribute(TextAttribute.RUN_DIRECTION, TextAttribute.RUN_DIRECTION_RTL);
        final FontMetrics metrics = getFontMetrics(font);
        final LineBreakMeasurer measurer = new LineBreakMeasurer(s.getIterator(), g2d.getFontRenderContext());
        final Point pen = new Point(20, 40);
        final float wrapwidth = 20 + metrics.stringWidth(chinese)/chinese.length();        while (measurer.getPosition() < s.getIterator().getEndIndex()) {            final TextLayout layout = measurer.nextLayout(wrapwidth);            pen.y += (layout.getAscent());
            final float dx = layout.isLeftToRight() ?
                    0 : (wrapwidth - layout.getAdvance());            layout.draw(g2d, pen.x + dx, pen.y);
            pen.y += layout.getDescent() + layout.getLeading();
        }        g2d.drawString(s.getIterator(), 20 , 30);
    }}