【Swing】 丸枠の四角形を描画する

サンプル

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.geom.Rectangle2D;

import javax.swing.Box;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.border.LineBorder;

public class Demo extends JFrame {
  private static final long serialVersionUID = 1L;

  public static void main(String[] args) {
    Demo frame = new Demo();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    Box box = Box.createVerticalBox();

    JLabel jLabel = new JLabel("テスト");
    jLabel.setBorder(new LineBorder(Color.BLACK, 2));
    jLabel.setPreferredSize(new Dimension(50, 100));
    box.add(jLabel);
    box.add(Box.createVerticalGlue());

    frame.add(box);
    frame.setBounds(100, 200, 400, 400);
    frame.setVisible(true);
  }

  public void paint(Graphics g) {
    Graphics2D g2 = (Graphics2D) g;
    g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

    // Case1
    BasicStroke roundStroke = new BasicStroke(6.0f, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND);
    g2.setStroke(roundStroke);
    g2.draw(new Rectangle2D.Double(100, 100, 150, 150));

    // Case2
    g2.drawRoundRect(50, 50, 150, 100, 30, 30);

    // Case3
    g2.fillRoundRect(260, 200, 100, 150, 30, 30);
  }
}

補足1 : アンチエイリアス

 * 丸枠部分がギザギザに見えてしまるので、滑らかな感じにする必要がある
   => この処理を「アンチエイリアス処理」という
~~~~
 g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

  + RenderingHints.KEY_ANTIALIASING : アンチエイリアス
  + RenderingHints.VALUE_ANTIALIAS_ON : アンチエイリアス有効
~~~~
https://www.javadrive.jp/java2d/graphics2d/index3.html
http://www.geocities.jp/okamotomkk/Java/07_2D/01BaseDraw/04Rendering/RenderingHints.htm

補足2 : 線の形状 (BasicStrokeクラス)

 * 以下のサイトが詳しい。
http://www.geocities.jp/okamotomkk/Java/07_2D/01BaseDraw/03LineFigureStroke/LineFigureStroke.htm

線の端(ハジ)の形状

https://www.javadrive.jp/java2d/stroke/index3.html
`#`値説明
1CAP_BUTT装飾なし
2CAP_ROUND両端を半円
3CAP_SQUARE両端を正方形

線の結合方式

https://www.javadrive.jp/java2d/stroke/index4.html
`#`値説明
1JOIN_BEVEL直線に接合
2JOIN_MITER外側の端が重なるまで延長して接合
3JOIN_ROUND角を丸く切り落として接合

参考文献

http://java.keicode.com/lib/graphics-drawing.php
http://www1.bbiq.jp/takeharu/Applet9.html
http://www.geocities.jp/okamotomkk/Java/07_2D/01BaseDraw/03LineFigureStroke/LineFigureStroke.htm