Swing/SpinnerTextColor のバックアップ差分(No.7)
- バックアップ一覧
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- バックアップ を表示
- Swing/SpinnerTextColor へ行く。
- 1 (2013-04-29 (月) 08:31:48)
- 2 (2015-10-13 (火) 20:06:28)
- 3 (2017-04-12 (水) 18:56:21)
- 4 (2018-03-28 (水) 18:18:34)
- 5 (2018-04-02 (月) 18:32:17)
- 6 (2018-04-04 (水) 21:33:15)
- 7 (2018-04-09 (月) 14:54:35)
- 8 (2018-04-19 (木) 13:49:19)
- 9 (2018-04-20 (金) 17:21:35)
- 10 (2020-04-12 (日) 01:37:28)
- 11 (2021-10-19 (火) 13:00:03)
- 追加された行はこの色です。
- 削除された行はこの色です。
--- category: swing folder: SpinnerTextColor title: JComboBoxをJSpinnerの代わりに使用する tags: [JSpinner, JComboBox, ListCellRenderer, Html, ActionMap] author: aterai pubdate: 2013-04-29T08:31:48+09:00 description: JSpinnerの代わりにJComboBoxを使用することで、アイテムの文字色などを変更しています。 image: https://lh6.googleusercontent.com/-kpruQCgOnLE/UX2r6exfrII/AAAAAAAABqo/JZnFlTBy1zw/s800/SpinnerTextColor.png --- * 概要 [#summary] `JSpinner`の代わりに`JComboBox`を使用することで、アイテムの文字色などを変更しています。 #download(https://lh6.googleusercontent.com/-kpruQCgOnLE/UX2r6exfrII/AAAAAAAABqo/JZnFlTBy1zw/s800/SpinnerTextColor.png) * サンプルコード [#sourcecode] #code(link){{ JButton nb = createArrowButton(SwingConstants.NORTH); nb.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { e.setSource(comboBox); comboBox.getActionMap().get("selectPrevious2").actionPerformed(e); } }); JButton sb = createArrowButton(SwingConstants.SOUTH); sb.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { e.setSource(comboBox); comboBox.getActionMap().get("selectNext2").actionPerformed(e); } }); Box box = Box.createVerticalBox(); box.add(nb); box.add(sb); JPanel p = new JPanel(new BorderLayout()) { @Override public Dimension getPreferredSize() { Dimension d = super.getPreferredSize(); return new Dimension(d.width, 20); } }; p.add(comboBox); p.add(box, BorderLayout.EAST); }} * 解説 [#explanation] 上記のサンプルでは、ドロップダウンリストの表示を無効にした`JComboBox`と`2`つの`ArrowButton`を組み合わせて、`JSpinner`風のコンポーネントを作成しています。`JComboBox`のセルレンダラーは`Html`タグが使用可能なので、各アイテムの文字色を`<font>`タグを使って変更しています。 - `BasicComboBoxUI#createArrowButton()`メソッドをオーバーライドして、`JComboBox`の`ArrowButton`を非表示に設定 -- [[JComboBoxのArrowButtonを隠す>Swing/HideComboArrowButton]] - `BasicComboBoxUI#setPopupVisible(...)`、`BasicComboBoxUI#createPopup()`、`BasicComboPopup#show()`メソッドなどをオーバーライドしてドロップダウンリストを無効化 - `JComboBox#getActionMap()#get("selectNext2")`などで取得したアクションを実行する`ArrowButton`を作成してレイアウト -- [[JTableを別コンポーネントから操作>Swing/SelectAllButton]] -- [[JComponentのKeyBinding一覧を取得する>Swing/KeyBinding]] - ボタンをクリックしたままの場合、値変更が繰り返し実行されるリピート機能には未対応 -- [[JButtonがマウスで押されている間、アクションを繰り返すTimerを設定する>Swing/AutoRepeatTimer]] ---- - 以下は、`JSpinner`の`Editor`を`JFormattedTextField`から`JLabel`に変更する場合のサンプル #code{{ import java.awt.*; import java.awt.event.*; import java.beans.*; import java.util.Objects; import javax.swing.*; import javax.swing.event.*; public class SpinnerTest { public JComponent makeUI() { String[] items = { "<html><font color='red'>Sunday</font> <font color='gray'>(Sun.)", "<html><font color='black'>Monday</font> <font color='gray'>(Mon.)", "<html><font color='black'>Tuesday</font> <font color='gray'>(Tue.)", "<html><font color='black'>Wednesday</font> <font color='gray'>(Wed.)", "<html><font color='black'>Thursday</font> <font color='gray'>(Thu.)", "<html><font color='black'>Friday</font> <font color='gray'>(Fri.)", "<html><font color='blue'>Saturday</font> <font color='gray'>(Sat.)" }; SpinnerListModel model = new SpinnerListModel(items); JSpinner spinner = new JSpinner(model) { @Override public void setEditor(JComponent editor) { JComponent oldEditor = getEditor(); if (!editor.equals(oldEditor) && oldEditor instanceof HTMLListEditor) { ((HTMLListEditor) oldEditor).dismiss(this); } super.setEditor(editor); } }; spinner.setEditor(new HTMLListEditor(spinner)); JPanel p = new JPanel(); p.add(spinner); return p; } public static void main(String... args) { EventQueue.invokeLater(() -> { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (Exception e) { e.printStackTrace(); } JFrame f = new JFrame(); f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); f.getContentPane().add(new SpinnerTest().makeUI()); f.setSize(320, 240); f.setLocationRelativeTo(null); f.setVisible(true); }); } } class HTMLListEditor extends JLabel implements ChangeListener { @Override public Dimension getPreferredSize() { Dimension d = super.getPreferredSize(); d.width = 200; return d; } private final JSpinner spinner; protected HTMLListEditor(JSpinner spinner) { super(); if (!(spinner.getModel() instanceof SpinnerListModel)) { throw new IllegalArgumentException("model not a SpinnerListModel"); } this.spinner = spinner; 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 (toolTipText != null) { setToolTipText(toolTipText); } } @Override public void stateChanged(ChangeEvent e) { JSpinner spinner = (JSpinner) e.getSource(); setText(Objects.toString(spinner.getValue())); } public void dismiss(JSpinner spinner) { spinner.removeChangeListener(this); } } }} * 参考リンク [#reference] - [[JComboBoxのArrowButtonを隠す>Swing/HideComboArrowButton]] - [[JTableを別コンポーネントから操作>Swing/SelectAllButton]] - [[JComponentのKeyBinding一覧を取得する>Swing/KeyBinding]] - [[JButtonがマウスで押されている間、アクションを繰り返すTimerを設定する>Swing/AutoRepeatTimer]] * コメント [#comment] #comment #comment