TITLE:JTextFieldの角を丸める

Posted by terai at 2010-10-04

JTextFieldの角を丸める

角丸のJTextFieldを作成します。コードはUnleash Your Creativity with Swing and the Java 2D API!Swing - custom JTextFieldから引用しています。

  • &jnlp;
  • &jar;
  • &zip;

#screenshot

サンプルコード

JTextField textField01 = new JTextField(20) {
  //Unleash Your Creativity with Swing and the Java 2D API!
  //http://java.sun.com/products/jfc/tsc/articles/swing2d/index.html
  @Override protected void paintComponent(Graphics g) {
    int w = getWidth();
    int h = getHeight();
    Graphics2D g2 = (Graphics2D)g;
    g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
    g.setColor(getBackground());
    g.fillRoundRect(0, 0, w-1, h-1, h, h);
    g2.setColor(Color.GRAY);
    g2.drawRoundRect(0, 0, w-1, h-1, h, h);
    super.paintComponent(g);
  }
};
textField01.setOpaque(false);
textField01.setBorder(BorderFactory.createEmptyBorder(4, 8, 4, 8));
textField01.setText("aaaaaaaaaaa");

解説

//http://forums.sun.com/thread.jspa?threadID=260846
class RoundTextUI extends BasicTextFieldUI {
  public static ComponentUI createUI(JComponent c) {
    return new RoundTextUI();
  }
  public void installUI(JComponent c) {
    super.installUI(c);
    c.setBorder(new RoundBorder());
    c.setOpaque(false);
  }
  protected void paintSafely(Graphics g) {
    JComponent c = getComponent();
    if(!c.isOpaque()) {
      g.setColor(c.getBackground());
      g.fillRoundRect(0, 0, c.getWidth()-1, c.getHeight()-1, c.getHeight(), c.getHeight());
    }
    super.paintSafely(g);
  }
  private static class RoundBorder extends AbstractBorder {
    @Override public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) {
      Graphics2D g2 = (Graphics2D)g;
      g2.setColor(Color.GRAY);
      g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
      g2.drawRoundRect(x, y, width-1, height-1, height, height);
    }
    @Override public Insets getBorderInsets(Component c) {
      return new Insets(4, 8, 4, 8);
    }
    @Override public Insets getBorderInsets(Component c, Insets insets) {
      insets.left = insets.right = 8;
      insets.top = insets.bottom = 4;
      return insets;
    }
  }
}

参考リンク

コメント