Summary
JSpinnerのListEditorをJLabelに変更してテキストをHTMLで表示します。
Screenshot

Advertisement
Source Code Examples
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, KotlinDescription
ListEditor(default)- デフォルトの
ListEditorを使用 - エディタは
JFormattedTextFieldなのでHTMLタグは使用不可
- デフォルトの
HtmlListEditorJLabelを継承する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); } };
Reference
- Java Swing How to - Create custom renderer for JSpinner to show customized content icons
- JComboBoxをJSpinnerの代わりに使用する
JComboBoxを使用することで同様にHTMLを表示可能だがLookAndFeelが変化してしまう