import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.font.TextLayout; import java.awt.geom.AffineTransform; import java.awt.geom.Ellipse2D; import java.awt.geom.Line2D; import java.awt.geom.Rectangle2D; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.WindowConstants; public class Test { public static void main(String[] args) { JFrame frame = new JFrame("RenderingHints.KEY_STROKE_CONTROLのテスト"); frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); frame.setLocationByPlatform(true); JPanel panel = new JPanel() { @Override protected void paintComponent(Graphics graphics) { super.paintComponent(graphics); Graphics2D g = (Graphics2D) graphics; g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); for (Object hint : new Object[] { RenderingHints.VALUE_STROKE_DEFAULT, RenderingHints.VALUE_STROKE_PURE }) { g.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, hint); int x = hint == RenderingHints.VALUE_STROKE_DEFAULT ? 10 : 220; g.drawString(hint == RenderingHints.VALUE_STROKE_DEFAULT ? "VALUE_STROKE_DEFAULT" : "VALUE_STROKE_PURE", x, 20); g.drawString("draw", x, 50); g.drawString("drawString", x, 130); g.drawString("fill", x, 180); for (int i = 0; i < 20; i++) { int x2 = x + i * 10; double yOffset = i / 10d; g.draw(new Line2D.Double(x2, 60 + yOffset, x2 + 8, 60 + yOffset)); g.draw(new Rectangle2D.Double(x2, 70 + yOffset, 8, 8)); g.draw(new Ellipse2D.Double(x2, 90 + yOffset, 8, 8)); g.drawString("L", x2, 150 + (float) yOffset); g.fill(new Rectangle2D.Double(x2, 190 + yOffset, 8, 8)); g.fill(new Ellipse2D.Double(x2, 210 + yOffset, 8, 8)); AffineTransform transform = new AffineTransform(); transform.translate(x2, 240 + yOffset); g.fill(new TextLayout("L", g.getFont(), g.getFontRenderContext()).getOutline(transform)); } } } }; panel.setPreferredSize(new Dimension(430, 260)); frame.add(panel); frame.pack(); frame.setVisible(true); } }