概要
JSpinner
の代わりにJComboBox
を使用することで、アイテムの文字色などを変更しています。
Screenshot
Advertisement
サンプルコード
JButton nb = createArrowButton(SwingConstants.NORTH);
nb.addActionListener(e -> {
e.setSource(comboBox);
comboBox.getActionMap().get("selectPrevious2").actionPerformed(e);
});
JButton sb = createArrowButton(SwingConstants.SOUTH);
sb.addActionListener(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);
View in GitHub: Java, Kotlin解説
上記のサンプルでは、ドロップダウンリストの表示を無効にしたJComboBox
と2
つのArrowButton
を組み合わせて、JSpinner
風のコンポーネントを作成しています。JComboBox
のデフォルトセルレンダラーはJLabel
を継承していてHtml
タグが使用可能なので、各アイテムの文字色を<font>
タグで部分的に変更しています。
BasicComboBoxUI#createArrowButton()
メソッドをオーバーライドしてJComboBox
のArrowButton
を非表示に設定BasicComboBoxUI#setPopupVisible(...)
、BasicComboBoxUI#createPopup()
、BasicComboPopup#show()
メソッドなどをオーバーライドしてドロップダウンリストを無効化JComboBox#getActionMap()#get("selectNext2")
などで取得したアクションを実行するArrowButton
を作成してレイアウト- ボタンをクリックしたままの場合、値変更が繰り返し実行されるリピート機能には未対応
参考リンク
- JComboBoxのArrowButtonを隠す
- JTableを別コンポーネントから操作
- JComponentのKeyBinding一覧を取得する
- JButtonがマウスで押されている間、アクションを繰り返すTimerを設定する
- JSpinnerのエディタをJLabelに変更してHTMLを表示する
JSpinner
のEditor
をJFormattedTextField
からJLabel
に変更して同様の文字色変更を行うサンプル