Swing/VerticalIconAlignMultilineText のバックアップ(No.2)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/VerticalIconAlignMultilineText へ行く。
- title: JCheckBoxのチェックアイコンを一行目中央に配置する tags: [JCheckBox, Html, Icon] author: aterai pubdate: 2014-03-03T00:16:40+09:00 description: JCheckBoxのテキストが複数行の場合、チェックアイコンが一行目中央に配置されるよう設定します。
概要
JCheckBox
のテキストが複数行の場合、チェックアイコンが一行目中央に配置されるよう設定します。
Screenshot
Advertisement
サンプルコード
class WindowsVerticalAlignmentCheckBoxUI extends WindowsCheckBoxUI {
@Override public synchronized void paint(Graphics g, JComponent c) {
AbstractButton b = (AbstractButton) c;
// ...
// Paint the radio button
int y = HtmlViewUtil.getFirstLineCenterY(text, b, iconRect);
getDefaultIcon().paintIcon(c, g, iconRect.x, iconRect.y + y);
//....
}
public static int getFirstLineCenterY(String text, AbstractButton c, Rectangle iconRect) {
int y = 0;
if (text != null && c.getVerticalTextPosition() == SwingConstants.TOP) {
View v = (View) c.getClientProperty(BasicHTML.propertyKey);
if (v != null) {
try {
Element e = v.getElement().getElement(0);
Shape s = new Rectangle();
Position.Bias b = Position.Bias.Forward;
s = v.modelToView(e.getStartOffset(), b, e.getEndOffset(), b, s);
//System.out.println("v.h: " + s.getBounds());
y = (int) (.5 + Math.abs(s.getBounds().height - iconRect.height) * .5);
} catch (BadLocationException ex) {
ex.printStackTrace();
}
}
}
return y;
}
}
View in GitHub: Java, Kotlin解説
- 左:
SwingConstants.TOP
JCheckBox#setVerticalTextPosition(SwingConstants.TOP);
と設定して、チェックアイコンとテキストの上辺が揃うように設定- フォントサイズなどが大きくなると、チェックアイコンが上に飛び出しているように見えてしまう
- 右:
First line center
WindowsCheckBoxUI#paint(...)
などをオーバーライドし、一行目の中央にチェックアイコンの中心が揃うように設定<html>aa<font size="+5">bb</font>cc...</html>
のような一部の文字サイズを大きくしたようなテキストを設定しても行の中央に揃えることが可能