概要

JSpinnerListEditorJLabelに変更してテキストをHTMLで表示します。

サンプルコード

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);
        }
      };
      

参考リンク

コメント