概要
JSpinner
のListEditor
をJLabel
に変更してテキストをHTML
で表示します。
Screenshot
Advertisement
サンプルコード
class HtmlListEditor extends JLabel implements ChangeListener {
protected HtmlListEditor(JSpinner spinner) {
super();
if (!(spinner.getModel() instanceof SpinnerListModel)) {
throw new IllegalArgumentException("model not a SpinnerListModel");
}
spinner.addChangeListener(this);
setText(Objects.toString(spinner.getValue()));
setBorder(BorderFactory.createEmptyBorder(0, 5, 0, 5));
setOpaque(true);
setBackground(Color.WHITE);
setInheritsPopupMenu(true);
String toolTipText = spinner.getToolTipText();
if (Objects.nonNull(toolTipText)) {
setToolTipText(toolTipText);
}
}
@Override public void stateChanged(ChangeEvent e) {
JSpinner spinner = (JSpinner) e.getSource();
setText(Objects.toString(spinner.getValue()));
}
@Override public Dimension getPreferredSize() {
Dimension d = super.getPreferredSize();
d.width = 200;
return d;
}
// @see javax/swing/JSpinner.DefaultEditor.html#dismiss(JSpinner)
public void dismiss(JSpinner spinner) {
spinner.removeChangeListener(this);
}
}
View in GitHub: Java, Kotlin解説
ListEditor(default)
- デフォルトの
ListEditor
を使用 - エディタは
JFormattedTextField
なのでHTML
タグは使用不可
- デフォルトの
HtmlListEditor
JLabel
を継承するHtmlListEditor
を作成してJSpinner#setEditor(...)
で設定JLabel
がエディタになるのでHTML
タグが使用可能- このエディタは
JSpinner.DefaultEditor
を継承していないためJSpinner#setEditor(...)
でJSpinner
に設定する場合は以下のようにJSpinner#removeChangeListener(...)
を呼んでChangeListener
を除去する必要があるJSpinner spinner = new JSpinner(new SpinnerListModel(items)) { @Override public void setEditor(JComponent editor) { JComponent oldEditor = getEditor(); if (!editor.equals(oldEditor) && oldEditor instanceof HtmlListEditor) { ((HtmlListEditor) oldEditor).dismiss(this); } super.setEditor(editor); } };
参考リンク
- Java Swing How to - Create custom renderer for JSpinner to show customized content icons
- JComboBoxをJSpinnerの代わりに使用する
JComboBox
を使用することで同様にHTML
を表示可能だがLookAndFeel
が変化してしまう