Swing/HtmlSpinnerEditor の変更点
- 追加された行はこの色です。
- 削除された行はこの色です。
- Swing/HtmlSpinnerEditor へ行く。
- Swing/HtmlSpinnerEditor の差分を削除
--- category: swing folder: HtmlSpinnerEditor title: JSpinnerのエディタをJLabelに変更してHTMLを表示する tags: [JSpinner, HTML] author: aterai pubdate: 2018-04-09T14:48:47+09:00 description: JSpinnerのListEditorをJLabelに変更してテキストをHTMLで表示します。 image: https://drive.google.com/uc?id=1SC3ViNpsTsIE2fgR1wtXawwKHpOD8P1PYg --- * 概要 [#summary] `JSpinner`の`ListEditor`を`JLabel`に変更してテキストを`HTML`で表示します。 #download(https://drive.google.com/uc?id=1SC3ViNpsTsIE2fgR1wtXawwKHpOD8P1PYg) * サンプルコード [#sourcecode] #code(link){{ 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); } } }} * 解説 [#explanation] - 上: `ListEditor(default)` - `ListEditor(default)` -- デフォルトの`ListEditor`を使用 -- エディタは`JFormattedTextField`なので`HTML`タグは使用不可 - 下: `HtmlListEditor` - `HtmlListEditor` -- `JLabel`を継承する`HtmlListEditor`を作成して`JSpinner#setEditor(...)`で設定 -- `JLabel`がエディタになるので`HTML`タグが使用可能 -- このエディタは`JSpinner.DefaultEditor`を継承していないため`JSpinner#setEditor(...)`で`JSpinner`に設定する場合は、以下のように`JSpinner#removeChangeListener(...)`を呼んで`ChangeListener`を除去する必要がある -- このエディタは`JSpinner.DefaultEditor`を継承していないため`JSpinner#setEditor(...)`で`JSpinner`に設定する場合は以下のように`JSpinner#removeChangeListener(...)`を呼んで`ChangeListener`を除去する必要がある #code{{ 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] - [http://www.java2s.com/Tutorials/Java/Swing_How_to/JSpinner/Create_custom_renderer_for_JSpinner_to_show_customized_content_icons.htm Java Swing How to - Create custom renderer for JSpinner to show customized content icons] - [[JComboBoxをJSpinnerの代わりに使用する>Swing/SpinnerTextColor]] -- `JComboBox`を使用することで同様に`HTML`を表示可能だが`LookAndFeel`が変化してしまう * コメント [#comment] #comment #comment