概要

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 all

解説

  • 上: ListEditor(default)
    • デフォルトのListEditorを使用
    • エディタはJFormattedTextFieldなので、HTMLは使用できない
  • 下: HtmlListEditor
    • JLabelを継承するHtmlListEditorを作成してJSpinner#setEditor(...)で設定
    • JLabelがエディタになるので、HTMLが使用可能で編集不可になる
    • JSpinner.DefaultEditorを継承していないので、JSpinner#setEditor(...)でエディタを変更する場合は、以下のように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);
        }
      };
      

参考リンク

コメント