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);
}}
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);
}}
直接搞几个JPanel放上去就行了。加JPanel的时候可以指定坐标的吧。