Swing/TriStateCheckBox のバックアップ(No.4)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/TriStateCheckBox へ行く。
- 1 (2011-12-12 (月) 15:00:11)
- 2 (2011-12-12 (月) 21:28:18)
- 3 (2012-03-08 (木) 12:43:16)
- 4 (2012-12-14 (金) 13:45:50)
- 5 (2013-08-17 (土) 15:40:04)
- 6 (2014-11-22 (土) 03:59:58)
- 7 (2015-01-22 (木) 21:07:06)
- 8 (2016-04-27 (水) 18:09:24)
- 9 (2017-04-07 (金) 13:51:51)
- 10 (2017-08-01 (火) 14:19:18)
- 11 (2018-08-02 (木) 15:33:10)
- 12 (2021-12-24 (金) 12:40:59)
- 13 (2023-10-23 (月) 20:08:58)
- 14 (2023-11-03 (金) 22:12:26)
- 15 (2023-11-15 (水) 09:33:24)
TITLE:JCheckBoxに不定状態のアイコンを追加する
Posted by aterai at 2011-12-12
JCheckBoxに不定状態のアイコンを追加する
JCheckBoxの選択状態、非選択状態に加えて、不定状態を表すアイコンを追加します。
- &jnlp;
- &jar;
- &zip;
サンプルコード
JCheckBox checkBox = new JCheckBox("TriState JCheckBox") {
protected TriStateActionListener listener = null;
class TriStateActionListener implements ActionListener{
protected Icon icon;
public void setIcon(Icon icon) {
this.icon = icon;
}
@Override public void actionPerformed(ActionEvent e) {
JCheckBox cb = (JCheckBox)e.getSource();
if(!cb.isSelected()) {
cb.setIcon(icon);
}else if(cb.getIcon()!=null){
cb.setIcon(null);
cb.setSelected(false);
}
}
}
@Override public void updateUI() {
final Icon oi = getIcon();
removeActionListener(listener);
setIcon(null);
super.updateUI();
EventQueue.invokeLater(new Runnable() {
@Override public void run() {
if(listener==null) {
listener = new TriStateActionListener();
}
Icon icon = new IndeterminateIcon();
listener.setIcon(icon);
addActionListener(listener);
if(oi!=null) {
setIcon(icon);
}
}
});
}
};
View in GitHub: Java, Kotlinclass IndeterminateIcon implements Icon {
private final Color color = UIManager.getColor("CheckBox.foreground");
private final Icon icon = UIManager.getIcon("CheckBox.icon");
@Override public void paintIcon(Component c, Graphics g, int x, int y) {
icon.paintIcon(c, g, x, y);
int w = getIconWidth(), h = getIconHeight();
int a = 4, b = 2;
Graphics2D g2 = (Graphics2D)g;
g2.setPaint(Color.BLACK);
g2.translate(x, y);
g2.fillRect(a, (h-b)/2, w-a-a, b);
g2.translate(-x, -y);
}
@Override public int getIconWidth() { return icon.getIconWidth(); }
@Override public int getIconHeight() { return icon.getIconHeight(); }
}
解説
上記のサンプルでは、UIManager.getIcon("CheckBox.icon");で取得した非選択状態のチェックボックスアイコンの上に横棒を引いて不定状態のアイコンを作成しています。
- 不定状態かどうかは、JCheckBox#getIcon()がnullかどうかで判断する手抜き版
- 横棒の色はUIManager.getColor("CheckBox.foreground");を使用しているが、LnFによっては無意味
- JTableHeaderにJCheckBoxを追加してセルの値を切り替える で使用すると、Nimbus LnF の場合だけ、アイコンと文字列のベースラインがずれる?
- 文字列もImageIconにして回避
- Nimbus LnF で、不定状態アイコンのフォーカスやロールオーバーが表示されない
参考リンク
- JavaSpecialists 145 - TristateCheckBox Revisited
- swing - Tristate Checkboxes in Java - Stack Overflow