TITLE:TitledBorderとMatteBorderを使用してTitledSeparatorを作成する

Posted by aterai at 2012-08-27

TitledBorderとMatteBorderを使用してTitledSeparatorを作成する

TitledBorderとMatteBorderを使用してTitle付きのSeparatorを作成します。

  • &jnlp;
  • &jar;
  • &zip;
TitledSeparator.png

サンプルコード

private static Border makeTitledSeparator(
    String title, final Color color, final Color darker, final Color brighter,
    final int height, int titlePosition) {
  return BorderFactory.createTitledBorder(
      BorderFactory.createMatteBorder(height, 0, 0, 0, new Icon() {
    private int width = -1;
    private Paint painter1, painter2;
    @Override public void paintIcon(Component c, Graphics g, int x, int y) {
      int w = c.getWidth();
      if(w!=width || painter1==null || painter2==null) {
        width = w;
        Point2D start  = new Point2D.Float(0f, 0f);
        Point2D end  = new Point2D.Float((float)width, 0f);
        float[] dist   = {0.0f, 1.0f};
        painter1 = new LinearGradientPaint(start, end, dist, new Color[] {darker,   color});
        painter2 = new LinearGradientPaint(start, end, dist, new Color[] {brighter, color});
      }
      int h = getIconHeight()/2;
      Graphics2D g2  = (Graphics2D)g.create();
      g2.setPaint(painter1);
      g2.fillRect(x, y,   width, getIconHeight());
      g2.setPaint(painter2);
      g2.fillRect(x, y+h, width, getIconHeight()-h);
      g2.dispose();
    }
    @Override public int getIconWidth()  { return 200; } //dummy width
    @Override public int getIconHeight() { return height; }
  }), title, TitledBorder.DEFAULT_JUSTIFICATION, titlePosition);
}
View in GitHub: Java, Kotlin

解説

TitledBorderと左下右のインセットが0(上インセットのみ設定)で、タイルアイコンでグラデーションを行うMatteBorderを組み合わせて、TitledSeparatorを作成しています。

    • タイトルの垂直位置がデフォルト(TitledBorder.DEFAULT_POSITION)で、Separator上に重なるように表示
    • タイトルの垂直位置が上(TitledBorder.ABOVE_TOP)で、Separatorの上に表示
    • JSeparator を使用

参考リンク

コメント